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