有一个班级X.
X类中的方法method()
会抛出SomeException
。
我想知道哪种处理异常的方法更好 - 效率更高。如果它围绕try-block方法抛出异常和所有依赖关系或保持try-block之外的依赖,但是在失败后从方法返回。
1
public void test() {
X x = new X();
try {
T temp = tx.method();
temp.doWhatever();
}
catch(SomeException e) { handleException(e); }
}
或
2
public void test() {
X x = new X();
T temp = null;
try {
temp = tx.method();
}
catch(SomeException e) {
handleException(e);
return;
}
temp.doWhatever();
}
编辑:(在您的注释之后)
我更不用说我的代码了:
1。
tx.method()
将抛出一个异常,因此下一件将被排除的事情是catch
- 阻止。 temp
仍为null
并不重要,因为程序会跳过temp.doWhatever();
行并且不会有NullPointerException
。
2。
这里我使用return
指令,因为我不想执行temp.doWhatever()
,因为temp
是null
答案 0 :(得分:1)
只有第一个是可能的,因为temp是在里面声明的。
我个人选择第一个,否则需要在try之前声明:T temp = null。
更正问题后
亲优先
第一个代码具有较少的跳转指令,变量temp
更加本地化,并且没有空初始化。
此外,编码风格更紧凑,没有空初始化,可能是错误点。
此外,应排除异常;它更容易阅读第一个版本。 例外情况不应该中断线性编码和阅读过程。
Pro second
更明确的是异常可以源于何处。
答案 1 :(得分:1)
异常工作方式的一个关键点是你可以使用你的样式编号1:让代码块安心执行,无论它在哪里中断,流程都会被中断并处理错误。所以我总是建议第一种风格。
答案 2 :(得分:0)
第二种情况甚至不会编译(甚至没有意义),因为在temp
块之外看不到try
。无论如何,我会这样做:
public void test() {
X x = new X();
try {
T temp = tx.method();
temp.doWhatever();
}
catch(SomeException e) { handleException(e); }
}
由于初始化temp
失败,其余temp
操作不应执行。
答案 3 :(得分:0)
在方法中有多个返回值并不好。但这只是为了拥有可理解的代码。您可以避免使用布尔值和ifs返回。
我认为没有效率问题。如果在第一个语句中发生异常,则不执行第二个语句。如果没有异常那么......嗯...我认为由于第二种方法应该没有开销。您可以通过try catch:D
通知您“汇编程序”代码的外观在我看来,编写不可靠的代码更为重要。现在的编译器非常好,并且可以优化最好的东西。
答案 4 :(得分:0)
选项二因可扩展性原因而不利。假设后来有人决定test()应该在test.doWhatever()之后做一些事情,即使遇到异常情况。他们必须在那时将代码重构为选项1。由于从一开始就没有使用选项1的成本,因此没有理由他们必须这样做。
此外,即使编译器仍然接受它,从catch块返回也会违反try / catch块的设计原则。为了使catch成为一个返回点,它应该抛出异常,因为由于异常情况而调用了该动作。
答案 5 :(得分:-1)
我认为这两种方法没有任何区别。