0

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

4

2 回答 2

4

据我了解,异常表明一些“可恢复”错误。

好吧,这取决于解释和有问题的例外。在很多情况下,你真的做不了什么。

但即使你不能真正做很多事情,你也可能不想让整个程序崩溃。记录(甚至忽略)错误并继续前进是这里的适当响应。

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

为什么不?

难道你不能在调用方法之前检查对象是否为空吗?

当然。这是一件非常常见的事情。

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

似乎如果您尝试在空引用上调用方法,程序应该立即中止并崩溃,

这就是异常的用途。

然后,调用者可以决定他们是想尝试对此做些什么还是只是崩溃。

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

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


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

由于它导致的所有问题(程序因 NPE 崩溃或更糟糕的行为),Null 被称为十亿美元的错误,一些较新的语言如 Scala 或 Rust 试图通过不允许 Null 值来修复它(相反,您必须明确将值包装在 Optional 结构中)。

于 2013-09-04T01:22:24.097 回答
2

RuntimeExceptions 通常对于特定操作是不可恢复的,这就是为什么您不需要捕获它们,但是整个 Web 服务器不应该崩溃,因为某个地方的错误在null不应该出现的时候使用了。NullPointerException允许程序的工具记录错误并适当地报告它,同时允许其他并行操作继续。

于 2013-09-04T01:22:43.110 回答