我问的是关于Java的这个主题,但我想它适用于许多语言。
考虑,
if(myVariable==null){
doSomethingAboutIt();
}
else carryOn(myVariable);
和
try{
carryOn(MyVariable);
}catch(NullPointerException e ){
doSOmethingAboutIt();}
这两个代码块是否基本相同?有没有理由选择第二种方法?当然,更好的是myVariable永远不会为null,但似乎检查它的最佳方法是做一个简单的if语句。
答案 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类,您可以利用它而不是创建自己的类。