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。发现了这个错误
Johannes Kuhn

Answers:


8

OpenJ9当前不支持JEP 358

NullPointerException尚未实施的扩展消息

JEP 358:NullPointerExceptionJava 14 VM生成a 并且您启用了该功能时,有用的NullPointerExceptions提供扩展的消息。但是,请注意,此时尚未在OpenJ9中实现。

此错误中跟踪进度

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


感谢您指出这一点。他们应该在OpenJDK发行说明中提到这一点。openjdk.java.net/projects/jdk/14
Pradeep

2
@Pradeep OpenJ9由Eclipse而非Oracle开发。
Slaw

1
@Pradeep OpenJ9与OpenJDK不同。
Mark Rotteveel

-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上的stacktrace。

在没有其他参数的情况下运行时:

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

并运行以下参数:

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

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


1
它无法回答为什么op无法获得任何有用的nullpointerexception。只是一个“嘿,您可以使用e.getMessage()” 在代码中获取消息。
Johannes Kuhn

@JohannesKuhn不是吗?他们让异常冒泡到堆栈跟踪,在该跟踪中参数正在修改异常消息。因此,我正在显示消息正在更改。
马特

1
问题出在其他地方。即使op将运行您的代码,它也不会更改结果(始终null作为消息)
Johannes Kuhn

1
e.getMessage()如果您没有捕获到异常,则来自的消息应该与堆栈跟踪中显示的消息相同-除非您已经对此进行了测试并观察到捕获与不捕获之间的消息差异,那么我认为抓住它可以解决问题中的问题。
kaya3

@ kaya3是的,我也对其进行了更新,以包括堆栈跟踪版本的行为。
马特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.