【问题标题】:Why does Java have NullPointerException's?为什么 Java 会有 NullPointerException?
【发布时间】:2013-09-07 09:02:07
【问题描述】:

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

【问题讨论】:

  • "Couldn't you just check whether the object is null before making the method call?" -- 是什么阻止你这样做?
  • 我想this article 给出了很好的解释。

标签: java exception error-handling nullpointerexception jvm


【解决方案1】:

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

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

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

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

为什么不呢?

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

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

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

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

这就是异常的用途。

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

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

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


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

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

【讨论】:

    【解决方案2】:

    RuntimeExceptions 通常是不可恢复的当它不应该使用时,某处使用了nullNullPointerException 允许程序的工具记录错误并适当地报告它,同时允许其他并行操作继续。

    【讨论】:

      猜你喜欢
      • 2011-02-16
      • 2021-06-18
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      • 2014-12-18
      相关资源
      最近更新 更多