Java 14 Nullpointerexception keine detaillierte Nachricht

10

Java 14 hat viele neue Funktionen. Eine davon zeigt eine detaillierte Nachricht in NullPointerException an. Ich habe Java 14 installiert und versucht, unter der Klasse zu kompilieren und auszuführen, erhalte jedoch keine detaillierte Meldung. Vermisse ich etwas Bitte helfen Sie.

~/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)

Ich übergebe das vorgeschlagene Flag -XX: + ShowCodeDetailsInExceptionMessages an Java, aber es gibt keine detaillierte Nachricht. Bitte helfen Sie.

Pradeep
quelle
Haben Sie sichergestellt, dass javaces sich um Version 14 handelt?
RealSkeptic
2
Sie verwenden OpenJ9. Fand diesen Fehler
Johannes Kuhn

Antworten:

8

OpenJ9 unterstützt derzeit JEP 358 nicht :

Erweiterte Nachrichten für NullPointerExceptionnoch nicht implementiert

JEP 358: Hilfreiche NullPointerExceptions bieten erweiterte Nachrichten, wenn a NullPointerExceptionvon der Java 14-VM generiert wird und Sie die Funktion aktiviert haben. Beachten Sie jedoch, dass dies derzeit nicht in OpenJ9 implementiert ist.

Der Fortschritt wird in diesem Fehler verfolgt

Wenn Sie diese Funktion verwenden möchten, laden Sie die Hotspot-Variante von adoptopenjdk herunter. Es ist derselbe Anbieter wie Ihre aktuelle Distribution, daher ist dies nur eine kleine Änderung.

Johannes Kuhn
quelle
Vielen Dank für den Hinweis. Sie hätten diesen Punkt in den OpenJDK-Versionshinweisen erwähnen sollen. openjdk.java.net/projects/jdk/14
Pradeep
2
@Pradeep OpenJ9 wird von Eclipse entwickelt, nicht von Oracle.
Slaw
1
@Pradeep OpenJ9 ist nicht dasselbe Projekt wie OpenJDK.
Mark Rotteveel
-1

Ich behalte dies hier zur Klarstellung, da das OP nicht gesagt hat, wie hoch der erwartete Output ist.

Das folgende Beispiel funktioniert, weil der Hotspot jvm verwendet wird.

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());
        }
    }
}

Dies ist so ziemlich das gleiche Programm, außer dass nur die Nachricht angezeigt wird.

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

Null

Wenn mit dem zusätzlichen Argument ausgeführt.

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

"String.length ()" kann nicht aufgerufen werden, da "" null ist

Das Argument wirkt sich auch auf den Stacktrace auf dem Hotspot-JVM aus.

Bei Ausführung ohne zusätzliches Argument:

Ausnahme im Thread "main" java.lang.NullPointerException bei Exceptional.main (Exceptional.java:6)

Und laufen Sie mit dem Argument:

Ausnahme im Thread "main" java.lang.NullPointerException: "String.length ()" kann nicht aufgerufen werden, da "" bei Exceptional.main (Exceptional.java:6) null ist.

Ich habe fälschlicherweise gedacht, dass sich der Stack-Trace möglicherweise nicht ändert, da er bereits zusätzliche Informationen zum Code enthält. Wie die andere Antwort zeigt, handelt es sich um einen Fehler, der im openj9-JVM behoben wird.

matt
quelle
1
Es antwortet nicht, WARUM op keine hilfreiche Nullpointerexception erhält. Nur ein "Hey, du kannst die Nachricht in deinem Code mit bekommen e.getMessage()".
Johannes Kuhn
@ JohannesKuhn nicht wahr? Sie lassen die Ausnahme bis zu einem Stack-Trace sprudeln, in dem das Argument die Ausnahmemeldung ändert. Ich zeige also, dass sich die Nachricht ändert.
Matt
1
Das Problem liegt woanders. Selbst wenn op Ihren Code ausführen würde, ändert dies nichts am Ergebnis (immer nullals Nachricht)
Johannes Kuhn,
1
Die Nachricht von e.getMessage()sollte dieselbe sein, die im Stack-Trace angezeigt wird, wenn Sie die Ausnahme nicht abfangen. Wenn Sie dies nicht getestet und einen Unterschied in der Nachricht zwischen dem Abfangen und dem Nichtabfangen festgestellt haben, denke ich nicht Wenn Sie es fangen, wird das Problem in der Frage behoben.
kaya3
@ kaya3 true, ich habe es aktualisiert, um auch das Verhalten der Stack-Trace-Version zu berücksichtigen.
Matt