Java中异常和if-then的区别

Java中异常和if-then的区别,java,exception-handling,Java,Exception Handling,我有两个例子: void terminate(String x) { System.exit(0); } void x (long y) { if(y == null) { terminate(); } //code } ..... x(null); //Don't want that 这个例子似乎有效。我想确保long y不为null。我可以这样做: void x (long y) throws NullPointerException { //code } ... tr

我有两个例子:

void terminate(String x) {
     System.exit(0);
}

void x (long y) {
if(y == null) {
    terminate();
}
//code
}
.....
x(null); //Don't want that
这个例子似乎有效。我想确保long y不为null。我可以这样做:

void x (long y) throws NullPointerException {
//code
}
...
try {
x(null);
} catch (NullPointerException e) {
 e.printstacktrace();
}
性能上的区别是什么?在这样的例子中,它可能不可见,但在一个复杂的程序中,它是否重要?我是否应该开始实践异常而不是if-then?

在异常情况下使用异常,当发生了您没有预料到的事情,并且无法采取任何合理的措施来恢复时

否则,使用if-then并可能返回状态代码

就性能而言,与回报相比,异常会产生巨大的开销。调用一个方法并捕获一个异常(如果它不工作的话)是冗长而烦人的

void myOperation() {
   step1();
   step2();
   step3();
}
在这个例子中,当任何一个步骤失败时,整个操作都会失败,所以我不想处理任何一个

void myOperation(String number) {
    int n;
    try { 
        n = Integer.parse(number);
    } catch (NumberFormatException e) {
        n = DEFAULT;
    }
    doThings(n);
}
在这种情况下,必须捕获异常是很烦人的,因为我有点希望字符串无效,并且有一个合理的选择。异常使代码变得缓慢而冗长

性能上的区别是什么

带有异常的版本肯定会工作得更慢,并且会有处理异常、创建对象、填充堆栈跟踪等开销

在这样的例子中,它可能不可见,但在一个复杂的程序中, 这有关系吗?我应该开始实践例外而不是if-then吗

在复杂的程序中,没有一个使用这种处理可能的空指针异常的方法,而且在java中它实际上是反模式的,所以如果你不能用null保存,你应该像ifx一样进行NOTNULL检查=null或assert

另外,我建议您阅读更多关于java中异常以及检查/未检查异常之间的差异等内容


PS是关于空值检查的好话题。

A long不能为空。不要使用系统。事实上,您的代码已经在保护您不受空值的影响!long不能为null。异常不能替代流控制。不清楚您想问什么。在函数调用中使用异常来威胁错误,但如果它使senseI尊重地不同意检查异常必然是冗长的,则仍然检查null。更糟糕的是,必须检查每个返回是否为空。我宁愿方法抛出异常,也不愿返回null对象。如果没有一堆if-obj==null{//bail-anyway}构造,代码更容易阅读。@KevinO我添加了一个澄清的示例。