java 14 nullpointerexception sin mensaje detallado

10

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.

Pradeep
fuente
¿Te has asegurado de que tu javaces la versión 14?
RealSkeptic
2
Estás utilizando OpenJ9. Encontré este error
Johannes Kuhn

Respuestas:

8

OpenJ9 actualmente no es compatible con JEP 358 :

Mensajes extendidos para NullPointerExceptionaún no implementados

JEP 358: NullPointerExceptions útiles proporciona mensajes extendidos cuando NullPointerExceptionla máquina virtual Java 14 genera un a y usted ha habilitado la función. Sin embargo, tenga en cuenta que esto no está implementado en OpenJ9 en este momento.

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.

Johannes Kuhn
fuente
Gracias por señalar esto. Deberían haber mencionado este punto en las notas de lanzamiento de OpenJDK. openjdk.java.net/projects/jdk/14
Pradeep
2
@Pradeep OpenJ9 está desarrollado por Eclipse, no por Oracle.
Slaw
1
@Pradeep OpenJ9 no es el mismo proyecto que OpenJDK.
Mark Rotteveel
-1

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.

public class Exceptional{
    public static void main(String[] args){
        String a = null;
        try{
            System.out.println(a.length());
        } catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}

Este es más o menos el mismo programa, excepto que solo muestra el mensaje.

~/local/jdk-14+36/bin/java Exceptional.java 

nulo

Cuando se ejecuta con el argumento adicional.

 ~/local/jdk-14+36/bin/java -XX:+ShowCodeDetailsInExceptionMessages Exceptional.java

No se puede invocar "String.length ()" porque "" es nulo

El argumento también afecta el stacktrace en el hotspot jvm.

Cuando se ejecuta sin el argumento adicional:

Excepción en el hilo "main" java.lang.NullPointerException en Exceptional.main (Exceptional.java:6)

Y corre con el argumento:

Excepción en el hilo "main" java.lang.NullPointerException: No se puede invocar "String.length ()" porque "" es nulo en Exceptional.main (Exceptional.java:6)

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.

mate
fuente
1
No responde POR QUÉ op no obtiene ninguna excepción nula de puntería útil. Solo un "Oye, puedes recibir el mensaje en tu código con e.getMessage()".
Johannes Kuhn
@JohannesKuhn, ¿no es así? Están dejando que la excepción aparezca en una traza de la pila donde el argumento está modificando el mensaje de excepciones. Entonces estoy mostrando que el mensaje está cambiando.
mate
1
El problema radica en otro lugar. Incluso si op ejecutara su código, no cambia el resultado (siempre nullcomo mensaje)
Johannes Kuhn
1
El mensaje de 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.
kaya3
@ kaya3 verdadero, lo actualicé para incluir el comportamiento de la versión de seguimiento de la pila también.
mate