java 14 nullpointerexception немає детального повідомлення


10

У 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?
RealSkeptic

2
Ви використовуєте OpenJ9. Знайшли цю помилку
Йоганнес Кун

Відповіді:


8

Наразі OpenJ9 не підтримує JEP 358 :

Розширені повідомлення NullPointerExceptionще не реалізовані

JEP 358: Корисні NullPointerExceptions надає розширені повідомлення, коли a NullPointerExceptionгенерується Java 14 VM, і ви ввімкнули цю функцію. Однак майте на увазі, що наразі це не реалізовано в OpenJ9.

Прогрес відстежується в цій помилці

Якщо ви хочете скористатися цією функцією, скачайте варіант гарячої точки з accepttopenjdk. Це той самий постачальник, що і ваш поточний дистрибутив, тому це лише невеликі зміни.


Дякуємо, що вказали на це. Вони повинні були згадати про це у примітках до випуску OpenJDK. openjdk.java.net/projects/jdk/14
Pradeep

2
@Pradeep OpenJ9 розроблений Eclipse, а не Oracle.
Забій

1
@Pradeep OpenJ9 - не той самий проект, що і OpenJDK.
Марк Ротвевель

-1

Я зберігаю це для уточнення, оскільки ОП не сказала, який очікуваний результат.

Наступний приклад працює, оскільки він використовує точку доступу 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 ()", тому що "" є нульовим

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

Якщо запустити без додаткового аргументу:

Виняток у потоці "main" java.lang.NullPointerException на Excevable.main (Exceptions.java:6)

І запустіть з аргументом:

Виняток у потоці "main" java.lang.NullPointerException: Неможливо викликати "String.length ()", тому що "" є null на Exceptions.main (Exceptions.java:6)

Я неправильно вважав, що слід стека може не змінитися, оскільки він вже містить додаткову інформацію про код. Як вказує інша відповідь, це помилка, яку вирішують у openj9 jvm.


1
Він не відповідає ЧОМУ оп не отримує ніякої корисної нульовоїінтексцепції. Просто "Ей, ви можете отримати повідомлення у своєму коді за допомогою e.getMessage()".
Йоганнес Кун

@JohannesKuhn чи не все-таки? Вони пускають міхур виключення до сліду стека, де аргумент змінює повідомлення про винятки. Тому я показую, що повідомлення змінюється.
матовий

1
Проблема полягає ще десь. Навіть якщо op запустить ваш код, це не змінить результат (завжди nullяк повідомлення)
Йоханнес Кун

1
Повідомлення від e.getMessage()має бути таким самим, яке відображається у сліді стека, якщо ви не виберете виняток - якщо ви не перевірили це та не помітили різницю в повідомленні між ловом його проти не ловом, тоді я не думаю ловлячи це, вирішує питання у питанні.
kaya3

@ kaya3 правда, я оновив його, щоб включити поведінку версії сліду стека.
матовий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.