为什么Java在null对象上调用方法时会抛出异常?根据我的理解,异常表示一些“可恢复的”错误。但是,我看不到你要在try
块中包装方法调用然后捕获NullPointerException
的情况。你不能在进行方法调用之前检查对象是否为null
吗?看起来如果你尝试在空引用上调用方法,程序应该立即中止并崩溃,因为这表示程序员错误而不是“可恢复”错误。
答案 0 :(得分:4)
根据我的理解,异常表示某些“可恢复”错误。
嗯,这取决于解释和有问题的例外。在许多情况下,你真的不能做太多。
但即使你真的做不了多少,你也许不想让整个程序崩溃。记录(甚至忽略)错误并继续前进是一个恰当的回应。
但是,我看不到你会在try块中包装方法调用然后捕获NullPointerException的情况。
为什么不呢?
在进行方法调用之前,你不能只检查对象是否为空吗?
不确定。这是一件非常普遍的事情。
不幸的是,这也是一件非常普遍的事情。这确实是编程错误。但即使编程错误也需要优雅地处理,特别是当它们如此常见时。
看起来如果你尝试在空引用上调用方法,程序应该中止并立即崩溃,
这就是使用例外情况。
然后,来电者可以决定是否要尝试对此采取措施或只是崩溃。
因为这表示程序员错误而不是“可恢复”错误。
这也取决于解释和特例。例如,程序员不能对假定(根据API规范)非null为空的参数负责。
更好的问题可能是“为什么Java有空?”。
由于它导致的所有问题(程序因NPE崩溃甚至更糟糕的行为),Null被称为Billion Dollar Mistake,而一些较新的语言如Scala或Rust尝试通过不允许Null值来修复它(相反,你必须在Optional结构中明确地包装它。)
答案 1 :(得分:2)
RuntimeException
通常无法恢复,这就是为什么你不需要捕获它们,但整个Web服务器不应该因为一个bug而崩溃在一个地方某个地方使用null
时它应该没有。 NullPointerException
允许程序的工具记录错误并适当地报告,同时允许其他并行操作继续。