8218628: Add detailed message to NullPointerException describing what is null

This is the implementation of JEP 358: Helpful NullPointerExceptions.

Reviewed-by: coleenp, clanger, rschmelter, rriggs, forax, mr
This commit is contained in:
Goetz Lindenmaier 2019-10-14 11:36:17 +02:00
parent 6147018a0f
commit d8c6516c92
15 changed files with 3643 additions and 7 deletions

View file

@ -70,4 +70,35 @@ class NullPointerException extends RuntimeException {
public NullPointerException(String s) {
super(s);
}
/**
* 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
* {@code null} is returned.
*
* @implNote
* If no explicit message was passed to the constructor, and as
* long as certain internal information is available, a verbose
* description of the null reference is returned.
* The internal information is not available in deserialized
* NullPointerExceptions.
*
* @return the detail message string, which may be {@code null}.
*/
public String getMessage() {
String message = super.getMessage();
if (message == null) {
return getExtendedNPEMessage();
}
return message;
}
/**
* Get an extended exception message. This returns a string describing
* the location and cause of the exception. It returns null for
* exceptions where this is not applicable.
*/
private native String getExtendedNPEMessage();
}

View file

@ -0,0 +1,36 @@
/*
* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2019 SAP SE. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
#include "jni.h"
#include "jvm.h"
#include "java_lang_NullPointerException.h"
JNIEXPORT jstring JNICALL
Java_java_lang_NullPointerException_getExtendedNPEMessage(JNIEnv *env, jobject throwable)
{
return JVM_GetExtendedNPEMessage(env, throwable);
}