我有两个例子:
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();
}
性能有何不同?在这样的例子中,它可能不可见,但在复杂的程序中,它会重要吗?我是否应该接受例外的实践,而不是那时呢?
答案 0 :(得分:2)
在异常情况下使用例外情况,当您发生的事情没有发现时,以及无法做出明智的恢复。
否则,请使用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);
}
在这种情况下,必须捕获异常是令人讨厌的,因为我希望字符串无效并且有合理的替代方案。该异常使代码变得缓慢而冗长。
答案 1 :(得分:0)
性能差异是什么?
带有异常的版本肯定会运行得更慢,并且会产生处理异常,创建对象,填充堆栈跟踪等的开销。
在这样的示例中,它可能不可见,但在复杂的程序中, 会有关系吗?我是否应该接受例外的实践,而不是那时呢?
在复杂的程序中,没有人使用这种处理可能的空指针异常,并且它实际上是java中的反模式,所以如果你想用null保存,你应该像if(x)那样非空检查!= null)或断言。
另外,我建议您阅读更多有关java中的异常以及已检查/未检查异常之间的差异等内容。
PS here是关于空检查的好主题。