< prev index next >

src/java.base/share/classes/java/lang/NullPointerException.java

Print this page
rev 59899 : 8248476: No helpful NullPointerException message after calling fillInStackTrace
Summary: reported by christoph.dreis@freenet.de
Reviewed-by:

@@ -68,10 +68,26 @@
      */
     public NullPointerException(String s) {
         super(s);
     }
 
+    private volatile transient int numStackTracesFilledIn;
+    private volatile transient String extendedMessage;
+
+    /**
+     * {@inheritDoc}
+     */
+    public synchronized Throwable fillInStackTrace() {
+        // If the stack trace is changed the extended NPE algorithm
+        // will compute a wrong message. So compute it beforehand.
+        if (numStackTracesFilledIn == 1) {
+            extendedMessage = getExtendedNPEMessage();
+        }
+        numStackTracesFilledIn++;
+        return super.fillInStackTrace();
+    }
+
     /**
      * Returns the detail message string of this throwable.
      *
      * <p> If a non-null message was supplied in a constructor it is
      * returned. Otherwise, an implementation specific message or

@@ -87,11 +103,18 @@
      * @return the detail message string, which may be {@code null}.
      */
     public String getMessage() {
         String message = super.getMessage();
         if (message == null) {
-            return getExtendedNPEMessage();
+            synchronized(this) {
+                if (extendedMessage == null && numStackTracesFilledIn == 1) {
+                    // Only the original stack trace was filled in. Message will
+                    // compute correctly.
+                    extendedMessage = getExtendedNPEMessage();
+                }
+            }
+            return extendedMessage;
         }
         return message;
     }
 
     /**
< prev index next >