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