jep122
程序和Java应用程序也不例外,通常由许多方法,对象,函数,注释等组成。 在大量的小零件中,一个所谓的NullPointerException(NPE)可能潜伏在任何地方。 几乎不可能用手找到它,但是值得庆幸的是,JVM可以告诉开发人员问题出在哪里。 它指向确切的方法,文件名,甚至是NPE起源的代码行。 像这样:
Exception in thread "main" java.lang.NullPointerException
at Prog.main(Prog.java:5)
此错误消息属于代码行ai = 99;
–但是如果代码变得更加复杂,由多个变量组成(例如, abci = 99;
),该怎么办? 然后需要调试工具,因为根据Lindemaier和Schmelter的说法,大多数NPE是在生产环境中创建的。 最终遇到问题的支持工程师通常不是最初编写代码的开发人员,因此,对于他们而言,如果没有其他工具,则很难找到错误。
还请参见:
上述问题是JEP 358旨在解决的问题。 通过分析程序的字节码指令,JVM应该能够准确显示哪个变量返回空值。 然后,JVM将在NullPointerException中输出一个null-detail消息 ,该消息将与通常的消息一起出现。 它看起来像这样:
Exception in thread "main" java.lang.NullPointerException:
Cannot assign field 'i' because 'a' is null.
at Prog.main(Prog.java:5)
对于更复杂的示例( abci = 99;
)的消息将显示如下:
Exception in thread "main" java.lang.NullPointerException:
Cannot read field 'c' because 'a.b' is null.
at Prog.main(Prog.java:5)
JEP的目的是为作者和开发人员提供重要和有用的信息,以进行故障排除。 新的开发人员将不会感到困惑,也不必担心NPE,并且可以提高对给定程序的一般理解。
但是,Lindemaier和Schmelter还指出,该建议将意味着空详细消息可能包含源代码中的变量名-这可能构成安全风险-但忽略变量名将限制其建议的有效性。
有关JEP的更多信息,请参见OpenJDK网站上的正式建议。
翻译自: https://jaxenter.com/java-jep-358-improved-nullpointerexceptions-160882.html
jep122