【问题标题】:Catching null pointer exceptions捕获空指针异常
【发布时间】:2012-01-23 00:19:26
【问题描述】:

我问这个主要是关于 Java 的,但我想它适用于很多语言。

考虑一下,

if(myVariable==null){
    doSomethingAboutIt();
}
else carryOn(myVariable);

try{
    carryOn(MyVariable);
}
catch(NullPointerException e ){
      doSOmethingAboutIt();
}

这两个代码块本质上是一样的吗?有什么理由选择第二种方法吗?当然,如果 myVariable 从不为 null 会更好,但检查它的最佳方法似乎是执行一个简单的 if 语句。

【问题讨论】:

  • NullPointerExceptions 应该被认为是程序员错误。不要抓住他们。确保它们永远不会被抛出。

标签: java exception nullpointerexception try-catch


【解决方案1】:

从我的立场来看,我犹豫是否认为这两个代码块在意图上是等效的。当然,它们会执行相同的错误处理,但这是开发人员的决定,而不是其他任何事情。

对我来说,if 正在测试 以查看是否可以使用某个值,如果不能使用,它正在解决这个问题。 try...catch假设该值是有效的,如果不是,它会通过解决异常行为。

当出现异常的、破坏程序的代码(被零除等)时,应首先考虑异常。

【讨论】:

    【解决方案2】:

    不,那些代码块根本不一样。

    在第一个代码块中,您正在检查 myVariable 是否为 null,并且您只在一个时间点执行此操作。稍后,myVariable 可能会变成null 并最终抛出NullPointerException。如果发生这种情况,第二个代码 sn-p 将捕获异常,但第一个不会。

    此外,第二个代码 sn-p 将捕获NullPointerExceptions,它可能会从调用堆栈中的任何位置抛出,该调用堆栈是由carryOn(myVariable) 调用产生的。这可怕;您正在吞下一个假设特定变量是null 的异常操作,而它可能完全是其他东西。

    使用第一个代码sn-p。

    【讨论】:

    • 一个离别的念头。如果您曾经捕获 any 运行时异常(例如 NullPointerException),那么您可能做错了什么。以编程方式确定此类异常的来源非常困难,因此很难正确处理它们。
    【解决方案3】:

    您只对异常事件使用异常。使用第一个代码块,而不是第二个。

    【讨论】:

      【解决方案4】:

      好吧,carryOn(MyVariable); 本身永远不会抛出 NPE,除非 carryOn 中的其他东西正在引用空实例上的方法或属性调用。

      捕获异常比首先检查它的计算成本更高,因为生成异常需要生成堆栈跟踪等。

      我认为它也会产生“更干净”的代码。

      另请参阅: - Java try/catch performance, is it recommended to keep what is inside the try clause to a minimum? - Try Catch Performance Java

      【讨论】:

        【解决方案5】:

        第一种方法比捕获异常要好,因为会产生一些性能损失。我认为最好的方法是申请Null Object pattern。 Guava 库提供了 Optional 类,您可以利用它而不是创建自己的类。

        【讨论】:

          猜你喜欢
          • 2011-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-21
          • 2015-07-12
          相关资源
          最近更新 更多