我有一个try
... catch
... finally
阻止其catch
重新抛出异常:
try
{
startBombCountdownAndRunAsFastAsYouCan();
}
catch (BombExplodedOnYourFaceException ex)
{
displayMessage("Hahaha! It blew up on your face!");
throw ex;
}
finally
{
cleanFloor();
}
displayMessage("Wow, you pulled it off!");
在这个例子中,我需要执行cleanFloor()
,无论是否抛出异常。所以问题是:finally
子句总是执行,无论异常是否在相应的catch
子句中重新抛出?
答案 0 :(得分:5)
是的,这是最终概念创建的确切目的。
答案 1 :(得分:2)
是的,将始终执行finally块。
另外,如果你不打算使用明确捕获的异常作为旁注,你应该只使用“catch {... throw;}。
供参考:
http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx
答案 2 :(得分:2)
finally
通常已执行,但始终。
考虑以下Java程序,其中finally
块未执行:
package test;
public class TestFinally {
public static void main(String[] args) {
try {
throw new Exception ("throw!");
}
catch(Exception ex) {
System.out.println("catch!");
System.exit(0);
}
finally {
System.out.println("finally!");
}
}
}
输出:
catch!
如果控件永远返回到catch
,则只会执行finally catch,因为我们看不到它;确定您是否执行finally
基本上缩减为Halting Problem。
实际上,finally
块将通常执行。不总是。
Peter Norvig的Java IAQ: Infrequently Answered Questions对此有所了解:
问:finally子句中的代码永远不会执行,对吧?
嗯,几乎没有。但是这里是一个最终代码不会执行的例子,无论布尔选择的值是什么:
try { if (choice) { while (true) ; } else { System.exit(1); } } finally { code.to.cleanup(); }