java 14 nullpointerexception无详细消息

java 14 nullpointerexception无详细消息,java,java-14,openj9,Java,Java 14,Openj9,Java14有许多新特性。其中之一是在NullPointerException中显示详细消息。我安装了Java14并试图在类下编译和运行,但我没有得到任何详细的消息。我遗漏了什么吗?请帮忙 ~/code/demo/temp$ java -version openjdk version "14" 2020-03-17 OpenJDK Runtime Environment AdoptOpenJDK (build 14+36) Eclipse OpenJ9 VM AdoptOpenJDK (buil

Java14有许多新特性。其中之一是在NullPointerException中显示详细消息。我安装了Java14并试图在类下编译和运行,但我没有得到任何详细的消息。我遗漏了什么吗?请帮忙

~/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,但没有详细的消息。请帮助。

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

~/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)
以下示例之所以有效,是因为它使用的是hotspot 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上的stacktrace

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

线程“main”java.lang.NullPointerException中出现异常 位于exception.main(exception.java:6)

并与参数一起运行:

线程“main”java.lang.NullPointerException中的异常:无法调用“String.length()”,因为“”为null 位于exception.main(exception.java:6)

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

openj9当前:

NullPointerException
的扩展消息尚未实现 当Java 14 VM生成
NullPointerException
且您已启用该功能时,提供扩展消息。但是,请注意,目前OpenJ9中没有实现这一点

进展情况将在中跟踪


如果要使用此功能,请从OpenJDK下载hotspot变体。它与您当前的发行版是同一个供应商,因此这只是一个小改动。

您是否确保您的
javac
是版本14?您正在使用OpenJ9。发现它不能回答为什么op没有得到任何有用的nullpointerexception。只是一句“嘿,你可以用
e.getMessage()
”在代码中获取消息,@johanneskun不是吗?他们让异常冒泡到一个堆栈跟踪,当参数修改异常消息时。因此,我表明,信息正在发生变化。问题在于其他地方。即使op将运行您的代码,它也不会改变结果(始终
null
as message)。如果您没有捕获异常,则来自
e.getMessage()
的消息应该与堆栈跟踪中显示的消息相同-除非您已对此进行了测试,并观察到捕获异常与未捕获异常之间的消息差异,那么,我认为捕获它并不能解决问题中的问题。@kaya3是的,我更新了它,使其也包含堆栈跟踪版本的行为。感谢您指出这一点。他们应该在OpenJDK发行说明中提到这一点@Pradeep OpenJ9是由Eclipse而不是Oracle开发的。@Pradeep OpenJ9与OpenJDK不是同一个项目。