为什么Java有NullPointerException?

时间:2013-09-04 01:18:21

标签: java exception error-handling nullpointerexception jvm

为什么Java在null对象上调用方法时会抛出异常?根据我的理解,异常表示一些“可恢复的”错误。但是,我看不到你要在try块中包装方法调用然后捕获NullPointerException的情况。你不能在进行方法调用之前检查对象是否为null吗?看起来如果你尝试在空引用上调用方法,程序应该立即中止并崩溃,因为这表示程序员错误而不是“可恢复”错误。

2 个答案:

答案 0 :(得分:4)

  

根据我的理解,异常表示某些“可恢复”错误。

嗯,这取决于解释和有问题的例外。在许多情况下,你真的不能做太多。

但即使你真的做不了多少,你也许不想让整个程序崩溃。记录(甚至忽略)错误并继续前进是一个恰当的回应。

  

但是,我看不到你会在try块中包装方法调用然后捕获NullPointerException的情况。

为什么不呢?

  

在进行方法调用之前,你不能只检查对象是否为空吗?

不确定。这是一件非常普遍的事情。

不幸的是,这也是一件非常普遍的事情。这确实是编程错误。但即使编程错误也需要优雅地处理,特别是当它们如此常见时。

  

看起来如果你尝试在空引用上调用方法,程序应该中止并立即崩溃,

这就是使用例外情况。

然后,来电者可以决定是否要尝试对此采取措施或只是崩溃。

  

因为这表示程序员错误而不是“可恢复”错误。

这也取决于解释和特例。例如,程序员不能对假定(根据API规范)非null为空的参数负责。


更好的问题可能是“为什么Java有空?”。

由于它导致的所有问题(程序因NPE崩溃甚至更糟糕的行为),Null被称为Billion Dollar Mistake,而一些较新的语言如Scala或Rust尝试通过不允许Null值来修复它(相反,你必须在Optional结构中明确地包装它。)

答案 1 :(得分:2)

对于特定操作,

RuntimeException通常无法恢复,这就是为什么你不需要捕获它们,但整个Web服务器不应该因为一个bug而崩溃在一个地方某个地方使用null时它应该没有。 NullPointerException允许程序的工具记录错误并适当地报告,同时允许其他并行操作继续。