【问题标题】:java 14 nullpointerexception no detailed messagejava 14 nullpointerexception 没有详细信息
【发布时间】:2020-04-05 11:52:29
【问题描述】:

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,但没有详细消息。请帮忙。

【问题讨论】:

标签: java java-14 openj9


【解决方案1】:

OpenJ9 目前does not support JEP 358:

NullPointerException 的扩展消息尚未实现

当 Java 14 VM 生成 NullPointerException 并且您已启用该功能时,JEP 358: Helpful NullPointerExceptions 会提供扩展消息。但是请注意,目前 OpenJ9 中并未实现此功能。

进度在this bug中跟踪

如果你想使用这个功能,从adoptopenjdk下载热点变种。它与您当前的发行版是同一个供应商,所以这只是一个很小的变化。

【讨论】:

  • 感谢您指出这一点。他们应该在 OpenJDK 发行说明中提到这一点。 openjdk.java.net/projects/jdk/14
  • @Pradeep OpenJ9 由 Eclipse 开发,而不是 Oracle。
  • @Pradeep OpenJ9 与 OpenJDK 不是同一个项目。
【解决方案2】:

我将其保留在这里以进行澄清,因为 OP 没有说明预期的输出是什么。

以下示例有效,因为它使用的是热点 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 在 Exceptional.main(Exceptional.java:6)

并使用参数运行:

线程“main”java.lang.NullPointerException 中的异常:无法调用“String.length()”,因为“”为空 在 Exceptional.main(Exceptional.java:6)

我错误地认为堆栈跟踪可能不会更改,因为它已经包含有关代码的其他信息。正如另一个答案所指出的,这是 openj9 jvm 中正在解决的一个错误。

【讨论】:

  • 它没有回答为什么 op 没有得到任何有用的 nullpointerexception。只需一句“嘿,您可以使用 e.getMessage() 在您的代码中获取消息”。
  • @JohannesKuhn 不是吗?他们让异常冒泡到堆栈跟踪,因为参数正在修改异常消息。所以我表明消息正在发生变化。
  • 问题出在其他地方。即使 op 会运行你的代码,它也不会改变结果(总是null 作为消息)
  • 如果您没有捕获异常,来自e.getMessage() 的消息应该与堆栈跟踪中显示的消息相同 - 除非您已经对此进行了测试并观察到捕获它与捕获它之间的消息差异. 没有抓住它,那么我认为抓住它并不能解决问题中的问题。
  • @kaya3 是的,我更新了它以包含堆栈跟踪版本的行为。
猜你喜欢
  • 2018-05-30
  • 2015-10-26
  • 2022-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多