问题
在这个代码中,即使执行catch块并抛出第二个异常,也会设置someVar
?
public void someFunction() throws Exception {
try {
//CODE HERE
} catch (Exception e) {
Log.e(TAG, "", e);
throw new Exception(e);
} finally {
this.someVar= true;
}
}
#1 热门回答(140 赞)
是的,finally块总是运行...除非:
- 运行try-catch-finally块的线程被终止或中断
- 你使用System.exit(0);
- 以其他方式销毁底层VM
- 底层硬件在某种程度上无法使用
另外,如果finally块中的方法抛出一个未捕获的异常,那么之后就不会执行任何操作(即异常将像在任何其他代码中一样抛出)。发生这种情况的一个非常常见的情况是java.sql.Connection.close()
。
顺便说一下,我猜你所使用的代码示例仅仅是一个例子,但要注意将实际逻辑放在finally块中。 finally块用于资源清理(关闭数据库连接,释放文件句柄等),而不是必须运行的逻辑。如果必须在try-catch块之前运行它,远离可能抛出异常的东西,因为你的意图几乎肯定在功能上是相同的。
#2 热门回答(9 赞)
是。
finally块总是在try块退出时执行。
例外:
注意:如果在执行try或catch代码时JVM退出,则finally块可能无法执行。同样,如果执行try或catch代码的线程被中断或终止,则即使应用程序作为一个整体继续,finally块也可能不会执行。
#3 热门回答(1 赞)
The finally block always executes when the try block exits.unless你在try或catch中有System.exit(0)。