java 14 nullpointerexception нет подробного сообщения

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


person Pradeep    schedule 05.04.2020    source источник
comment
Вы убедились, что ваш javac версии 14?   -  person RealSkeptic    schedule 05.04.2020
comment
Вы используете OpenJ9. Обнаружена эта ошибка   -  person Johannes Kuhn    schedule 05.04.2020


Ответы (2)


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

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

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

Прогресс отслеживается в этой ошибке.

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

person Johannes Kuhn    schedule 05.04.2020
comment
Спасибо, что указали на это. Они должны были упомянуть об этом в примечаниях к выпуску OpenJDK. openjdk.java.net/projects/jdk/14 - person Pradeep; 05.04.2020
comment
@Pradeep OpenJ9 разработан Eclipse, а не Oracle. - person Slaw; 05.04.2020
comment
@Pradeep OpenJ9 - это не тот же проект, что и OpenJDK. - person Mark Rotteveel; 05.04.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 

нулевой

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

 ~/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 ()», потому что «» имеет значение null в Exceptional.main (Exceptional.java: 6)

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

person matt    schedule 05.04.2020
comment
Он не отвечает, ПОЧЕМУ op не получает никакого полезного исключения nullpointer. Просто Эй, вы можете получить сообщение в своем коде с помощью e.getMessage(). - person Johannes Kuhn; 05.04.2020
comment
@JohannesKuhn, не так ли? Они позволяют исключению подниматься до трассировки стека, где аргумент изменяет сообщение об исключении. Итак, я показываю, что сообщение меняется. - person matt; 05.04.2020
comment
Проблема кроется в другом. Даже если op запустит ваш код, это не изменит результат (всегда null как сообщение) - person Johannes Kuhn; 05.04.2020
comment
Сообщение от e.getMessage() должно быть таким же, как показано в трассировке стека, если вы не поймаете исключение - если вы не протестировали это и не заметили разницу в сообщении между его захватом и отсутствием захвата, тогда я не думаю, что его ловля решает проблему в вопросе. - person kaya3; 05.04.2020
comment
@ kaya3 правда, я обновил его, чтобы включить поведение версии трассировки стека. - person matt; 05.04.2020
comment
ОП заявил, что они добавляют параметр командной строки, но он все еще не работает. Так что ваш ответ не применим к их проблеме. - person RealSkeptic; 05.04.2020
comment
@RealSkeptic Это не решает их проблему, но я думаю, что это актуально, потому что показывает ожидаемый результат использования их аргумента в среде, где он работает. - person matt; 05.04.2020
comment
@matt Проголосовал против, предположительно, потому что вы не ответили на вопрос. Даже вы признаете, что это не решает их проблему! - person skomisa; 09.04.2020