5

除非有类似的代码行,否则throw new NullPointerException();空指针通常会在对结果为的表达式进行null操作时出现。所以,我的问题是,为什么空指针的消息不包含返回空的表达式?

4

2 回答 2

4

NullPointerException当您尝试取消引用 a 时会发生null,而不是在您刚刚创建或拥有一个时发生。堆栈跟踪包含该行,这已经很好了,而且 JVM 并不真正知道null它来自哪里,当它试图尽可能快地翻阅字节码时,它不会跟踪这些事情。


如果您在调试此类情况时遇到问题,您可以随时拆分表达式并使用临时变量:

String tmp = myObj.getSomething();
String result = tmp.substring(1);

如果上面的第一行抛出 NullPointerException (堆栈跟踪显示它来自该行,而不是来自内部myObj.getSomething()),您知道 myObj 为空。如果第 2 行抛出 NullPointerException,你就知道tmp是 null,即myObj.getSomething()返回 null。如果您随后注意到myObj.getSomething()在正常情况下实际上可能返回 null,那么您可以在if (tmp != null) { ... } else { ... }那里添加某种代码。

于 2013-03-12T07:28:59.783 回答
4

我不确定,但我想原因是如果 JVM 必须能够报告引发异常的精确表达式,可能会出现重大性能问题。

至少,它需要更改类文件格式以包含(真正)细粒度的源代码位置信息......比行号更细粒度。

无论如何,这个问题没有实际意义……因为它没有。

于 2013-03-12T07:29:38.577 回答