< 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 >