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óż.
javac
wersję 14?Odpowiedzi:
OpenJ9 obecnie nie obsługuje JEP 358 :
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.
źródło
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.
To jest prawie ten sam program, tyle że pokazuje tylko komunikat.
Po uruchomieniu z dodatkowym argumentem.
Argument wpływa również na stacktrace w jvm hotspotu.
Po uruchomieniu bez dodatkowego argumentu:
I uruchom z argumentem:
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.
źródło
e.getMessage()
”.null
jako wiadomość)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.