除非有类似的代码行,throw new NullPointerException();
通常在运行结果为null
的表达式时出现空指针。所以,我的问题是,为什么空指针的消息不包含返回null的表达式?
答案 0 :(得分:4)
NullPointerException
时,会发生 null
,而不是在您创建或拥有一个null
时。堆栈跟踪包含该行,并且它就像它获得的那样好,并且JVM并不真正知道String tmp = myObj.getSomething();
String result = tmp.substring(1);
来自何处,它在尝试尽可能快地通过字节码流失时不会跟踪这些事情
如果您在调试此类情况时遇到问题,可以随时拆分表达式并使用临时变量:
myObj.getSomething()
如果上面的第一行抛出NullPointerException(堆栈跟踪显示它来自该行,而不是来自tmp
内部),您知道myObj为null。如果第二行抛出NullPointerException,您知道myObj.getSomething()
为空,即myObj.getSomething()
返回null。如果您注意到if (tmp != null) { ... } else { ... }
在正常情况下实际上可能会返回null,那么您可以在那里添加{{1}}种代码。
答案 1 :(得分:4)
我不确定,但我想原因是如果JVM必须能够报告抛出异常的精确表达式,可能会出现重大性能问题。
至少,它需要更改类文件格式以包含(真正)细粒度的源代码位置信息......比行号更精细。
无论如何,这个问题没有实际意义......因为它没有。