即使你抛出一个新的异常,finally块也会运行吗?

问题

在这个代码中,即使执行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 赞)

是。

documentation

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)。