Java 14 tiene muchas características nuevas. Uno de ellos muestra un mensaje detallado en NullPointerException. Instalé Java 14 e intenté compilar y ejecutar debajo de la clase, pero no recibo ningún mensaje detallado. ¿Me estoy perdiendo algo? por favor ayuda.
~/code/demo/temp$ java -version
openjdk version "14" 2020-03-17
OpenJDK Runtime Environment AdoptOpenJDK (build 14+36)
Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.19.0, JRE 14 Mac OS X amd64-64-Bit Compressed References 20200313_47 (JIT enabled, AOT enabled)
OpenJ9 - 0133ba037
OMR - 1c04e0ef9
JCL - a73be60649 based on jdk-14+36)
~/code/demo/temp$ cat Hello.java
public class Hello {
public static void main(String args[]) {
String a = null;
System.out.println(a.length());
}
}
~/code/demo/temp$ javac Hello.java
~/code/demo/temp$ java -XX:+ShowCodeDetailsInExceptionMessages Hello
Exception in thread "main" java.lang.NullPointerException
at Hello.main(Hello.java:4)
Estoy pasando el indicador sugerido -XX: + ShowCodeDetailsInExceptionMessages a java pero no hay un mensaje detallado. Por favor ayuda.
javac
es la versión 14?Respuestas:
OpenJ9 actualmente no es compatible con JEP 358 :
El progreso se rastrea en este error
Si desea utilizar esta función, descargue la variante de punto de acceso de adoptopenjdk. Es el mismo proveedor que su distribución actual, por lo que esto es solo un pequeño cambio.
fuente
Mantengo esto aquí para aclararlo, ya que el OP no dijo cuál es el resultado esperado.
El siguiente ejemplo funciona porque está utilizando el punto de acceso jvm.
Este es más o menos el mismo programa, excepto que solo muestra el mensaje.
Cuando se ejecuta con el argumento adicional.
El argumento también afecta el stacktrace en el hotspot jvm.
Cuando se ejecuta sin el argumento adicional:
Y corre con el argumento:
Pensé incorrectamente que el seguimiento de la pila podría no cambiar porque ya incluye información adicional sobre el código. Como señala la otra respuesta, es un error que se está abordando en openj9 jvm.
fuente
e.getMessage()
".null
como mensaje)e.getMessage()
debería ser el mismo que se muestra en el seguimiento de la pila si no detecta la excepción, a menos que haya probado esto y haya observado una diferencia en el mensaje entre atraparlo y no atraparlo, entonces no creo atraparlo aborda el problema en la pregunta.