java 14 nullpointerexception brak szczegółowego komunikatu

10

Java 14 ma wiele nowych funkcji. Jeden z nich pokazuje szczegółowy komunikat w NullPointerException. Zainstalowałem Javę 14 i próbuję skompilować i uruchomić poniżej klasy, ale nie otrzymuję żadnego szczegółowego komunikatu. Czy coś mi brakuje? proszę pomóż.

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

Mijam sugerowaną opcję -XX: + ShowCodeDetailsInExceptionMessages do java, ale nie ma szczegółowej wiadomości. Proszę pomóż.

Pradeep
źródło
Czy upewniłeś się, że masz javacwersję 14?
RealSkeptic
2
Używasz OpenJ9. Znalazłem ten błąd
Johannes Kuhn

Odpowiedzi:

8

OpenJ9 obecnie nie obsługuje JEP 358 :

Rozszerzone wiadomości dla NullPointerExceptionjeszcze nie zaimplementowanych

JEP 358: Pomocne wyjątki NullPointerExceptions zapewniają rozszerzone komunikaty, gdy NullPointerExceptiongenerowana jest przez maszynę wirtualną Java 14 i włączono tę funkcję. Należy jednak pamiętać, że nie jest to obecnie zaimplementowane w OpenJ9.

Postęp jest śledzony w tym błędzie

Jeśli chcesz skorzystać z tej funkcji, pobierz wariant hotspotu z adoptopenjdk. Jest to ten sam dostawca, co obecna dystrybucja, więc to tylko niewielka zmiana.

Johannes Kuhn
źródło
Dzięki za wskazanie tego. Powinni byli wspomnieć o tym punkcie w informacjach o wydaniu OpenJDK. openjdk.java.net/projects/jdk/14
Pradeep
2
@Pradeep OpenJ9 jest rozwijany przez Eclipse, a nie Oracle.
Slaw
1
@Pradeep OpenJ9 to nie ten sam projekt co OpenJDK.
Mark Rotteveel,
-1

Trzymam to tutaj dla wyjaśnienia, ponieważ PO nie powiedział, jaki jest oczekiwany wynik.

Poniższy przykład działa, ponieważ używa jvm hotspot.

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

To jest prawie ten sam program, tyle że pokazuje tylko komunikat.

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

zero

Po uruchomieniu z dodatkowym argumentem.

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

Nie można wywołać „String.length ()”, ponieważ „” ma wartość NULL

Argument wpływa również na stacktrace w jvm hotspotu.

Po uruchomieniu bez dodatkowego argumentu:

Wyjątek w wątku „main” java.lang.NullPointerException at Exceptional.main (Exceptional.java:6)

I uruchom z argumentem:

Wyjątek w wątku „main” java.lang.NullPointerException: Nie można wywołać „String.length ()”, ponieważ „” ma wartość NULL w Exceptional.main (Exceptional.java:6)

Niepoprawnie myślałem, że ślad stosu może się nie zmienić, ponieważ zawiera on już dodatkowe informacje o kodzie. Jak wskazuje druga odpowiedź, jest to błąd, który jest usuwany w jvm openj9.

matowy
źródło
1
Nie odpowiada DLACZEGO op nie otrzymuje żadnego pomocnego wyjątku zerowego. Po prostu „Hej, możesz dostać wiadomość do swojego kodu za pomocą e.getMessage()”.
Johannes Kuhn
@JohannesKuhn, prawda? Pozwalają, aby wyjątek pojawił się na stosie, gdy argument jest modyfikowany w komunikacie o wyjątkach. Pokazuję więc, że wiadomość się zmienia.
mat
1
Problem leży gdzie indziej. Nawet jeśli operacja uruchomiłaby Twój kod, nie zmienia wyniku (zawsze nulljako wiadomość)
Johannes Kuhn
1
Wiadomość z e.getMessage()powinna być taka sama, jak pokazana w śladzie stosu, jeśli nie złapiesz wyjątku - chyba że przetestowałeś to i zaobserwowałeś różnicę w wiadomości między złapaniem a nie złapaniem, to nie sądzę złapanie go rozwiązuje problem w pytaniu.
kaya3
@ kaya3 true, zaktualizowałem go, aby uwzględnić zachowanie wersji śledzenia stosu.
mat