12

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

4

2 回答 2

10

OpenJ9 目前不支持 JEP 358

NullPointerException尚未实施的扩展消息

JEP 358:有用的 NullPointerExceptionsNullPointerException在 Java 14 VM 生成 a 并且您已启用该功能时提供扩展消息。但是,请注意,这在 OpenJ9 中目前还没有实现。

此错误中跟踪进度

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

于 2020-04-05T12:24:10.190 回答
-1

我将其保留在这里以进行澄清,因为 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 上的堆栈跟踪。

在没有附加参数的情况下运行:

Exceptional.main(Exceptional.java:6) 处的线程“主”java.lang.NullPointerException 中的异常

并使用参数运行:

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

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

于 2020-04-05T12:09:15.010 回答