Java 14 имеет много новых функций. Один из них показывает подробное сообщение в NullPointerException. Я установил Java 14 и пытаюсь скомпилировать и запустить ниже класс, но я не получаю подробного сообщения. Я что-то упустил? пожалуйста помоги.
~/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)
Я передаю предложенный флаг -XX: + ShowCodeDetailsInExceptionMessages в java, но подробного сообщения нет. Пожалуйста помоги.
javac
версия 14?Ответы:
OpenJ9 в настоящее время не поддерживает JEP 358 :
Прогресс отслеживается в этой ошибке
Если вы хотите использовать эту функцию, загрузите вариант hotspot с сайта accepttopenjdk. Это тот же поставщик, что и у вашего текущего дистрибутива, так что это всего лишь небольшое изменение.
источник
Я оставляю это здесь для пояснения, поскольку ФП не сказал, каков ожидаемый результат.
Следующий пример работает, потому что он использует горячую точку jvm.
Это в значительной степени та же самая программа, за исключением того, что она просто показывает сообщение.
При запуске с дополнительным аргументом.
Аргумент также влияет на трассировку стека в горячей точке jvm.
При запуске без дополнительного аргумента:
И запустить с аргументом:
Я неправильно думал, что трассировка стека может не измениться, потому что она уже содержит дополнительную информацию о коде. Как указывает другой ответ, это ошибка, которая устраняется в openj9 jvm.
источник
e.getMessage()
".null
как сообщение)e.getMessage()
должно быть таким же, как показано в трассировке стека, если вы не поймали исключение - если вы не проверили это и не заметили разницу в сообщении между его перехватом и не перехватом, тогда я не думаю, что ловя это решает проблему в вопросе.