捕获空指针异常

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

考虑

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

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

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


答案 1

从我的立场来看,我不愿意将这两个代码块视为意图等效。当然,它们会经历相同的错误处理,但这是开发人员的决定, 而不是其他任何事情。

对我来说,正在测试一个值是否可以使用,如果不能,它正在解决这个问题。该块假定该值有效,如果该值无效,则通过该值来解决异常行为。iftry...catch

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


答案 2

不,这些代码块根本不相同。

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

此外,第二个代码片段将捕获可能从调用生成的调用堆栈中的任何位置引发的内容。这是可怕的。您正在吞下一个异常,该异常是在假设特定变量可能是完全另一回事的情况下运行的。NullPointerExceptionscarryOn(myVariable)null

使用第一个代码段。