即使您抛出新的异常,最终块是否也会运行?

2022-08-31 06:49:01

在此代码中,即使执行了 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

是的,最后的方块总是在运行...除非:

  • 运行 try-catch-final-block 的线程被终止或中断
  • 您使用System.exit(0);
  • 基础 VM 以其他方式销毁
  • 底层硬件在某些方面不可用

此外,如果最终块中的方法引发未捕获的异常,则不会执行任何后续操作(即,将像在任何其他代码中一样引发异常)。发生这种情况的一个非常常见的情况是 。java.sql.Connection.close()

顺便说一句,我猜你使用的代码示例只是一个示例,但要小心将实际逻辑放在最终块中。最后,该块用于资源清理(关闭数据库连接,释放文件句柄等),而不是用于必须运行的逻辑。如果它必须运行,请在 try-catch 块之前执行此操作,远离可能引发异常的内容,因为您的意图几乎肯定是功能相同的。


答案 2

是的。

请参阅文档

最终块始终在 try 块退出时执行。

异常:

注: 如果 JVM 在执行 try 或 catch 代码时退出,则 finally 块可能不会执行。同样,如果执行 try 或 catch 代码的线程被中断或终止,则即使应用程序作为一个整体继续,finally 块也可能不会执行。


推荐