java 14 nullpointerexception нет подробных сообщений - PullRequest
10 голосов
/ 05 апреля 2020

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, но подробного сообщения нет. Пожалуйста, помогите.

Ответы [ 2 ]

8 голосов
/ 05 апреля 2020

OpenJ9 в настоящее время не поддерживает JEP 358 :

Расширенные сообщения для NullPointerException еще не реализованы

JEP 358: Полезные NullPointerExceptions предоставляет расширенные сообщения, когда NullPointerException генерируется виртуальной машиной Java 14, и вы включили эту функцию. Однако следует помнить, что в настоящее время это не реализовано в OpenJ9.

Ход отслеживается в этой ошибке

Если вы хотите использовать эту функцию , скачайте вариант горячей точки с сайта accepttopenjdk. Это тот же поставщик, что и у вашего текущего дистрибутива, так что это небольшое изменение.

0 голосов
/ 05 апреля 2020

Я оставляю это здесь для пояснения, так как ОП не сказал, каков ожидаемый результат.

Следующий пример работает, потому что он использует горячую точку 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());
        }
    }
}

Это почти та же самая программа, за исключением того, что она просто показывает сообщение.

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

null

При запуске с дополнительным аргументом.

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

Невозможно вызвать "String.length ()", так как "" имеет значение null

Аргумент также влияет на трассировку стека в горячей точке jvm.

При запуске без дополнительного аргумента:

Исключение в потоке "main" java .lang.NullPointerException в Exceptional.main (Exceptional. java: 6)

И запустить с аргументом:

Исключение в потоке "main" java .lang.NullPointerException: Невозможно вызвать "String.length ()", потому что "" равно нулю at Exceptional.main (Exceptional. java: 6)

Я неправильно думал, что трассировка стека может не измениться, поскольку она уже содержит дополнительную информацию о коде. Как указывает другой ответ, это ошибка, которая устраняется в openj9 jvm.

...