8248476: No helpful NullPointerException message after calling fillInStackTrace

Reported by christoph.dreis@freenet.de

Reviewed-by: coleenp, dholmes, mchung
This commit is contained in:
Goetz Lindenmaier 2020-07-15 18:47:47 +02:00
parent a640835c62
commit 8906904591
2 changed files with 109 additions and 9 deletions

View file

@ -70,6 +70,27 @@ public class NullPointerException extends RuntimeException {
super(s);
}
// 0: no backtrace filled in, no message computed.
// 1: backtrace filled in, no message computed.
// 2: message computed
private transient int extendedMessageState;
private 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 (extendedMessageState == 0) {
extendedMessageState = 1;
} else if (extendedMessageState == 1) {
extendedMessage = getExtendedNPEMessage();
extendedMessageState = 2;
}
return super.fillInStackTrace();
}
/**
* Returns the detail message string of this throwable.
*
@ -89,7 +110,15 @@ public class NullPointerException extends RuntimeException {
public String getMessage() {
String message = super.getMessage();
if (message == null) {
return getExtendedNPEMessage();
synchronized(this) {
if (extendedMessageState == 1) {
// Only the original stack trace was filled in. Message will
// compute correctly.
extendedMessage = getExtendedNPEMessage();
extendedMessageState = 2;
}
return extendedMessage;
}
}
return message;
}