为什么空指针异常不提供null的表达式?

时间:2013-03-12 07:19:08

标签: java exception exception-handling nullpointerexception error-logging

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

2 个答案:

答案 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必须能够报告抛出异常的精确表达式,可能会出现重大性能问题。

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

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