捕获空指针异常

时间:2012-01-23 00:19:26

标签: java exception nullpointerexception try-catch

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

考虑,

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

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

这两个代码块是否基本相同?有没有理由选择第二种方法?当然,更好的是myVariable永远不会为null,但似乎检查它的最佳方法是做一个简单的if语句。

5 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:4)

不,那些代码块完全不一样。

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

此外,第二个代码段将捕获NullPointerExceptions,这些carryOn(myVariable)可能会从null调用产生的调用堆栈中的任何位置抛出。这是可怕的;如果特定变量为{{1}},则可能完全不同于其他情况下吞下异常操作。

使用第一个代码段。

答案 2 :(得分:3)

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

答案 3 :(得分:2)

好吧,carryOn(MyVariable);本身不会抛出NPE,除非carryOn中的其他内容引用了对null实例的方法或属性调用。

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

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

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

答案 4 :(得分:0)

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