小编典典

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

all

someVar即使执行了catch块并且抛出了第二个异常,这段代码也会被设置?

public void someFunction() throws Exception {
    try {
        //CODE HERE
    } catch (Exception e) {
        Log.e(TAG, "", e);
        throw new Exception(e);
    } finally {
        this.someVar= true;
    }
}

阅读 54

收藏
2022-08-20

共1个答案

小编典典

是的,finally 块总是运行......除非:

  • 运行 try-catch-finally 块的线程被杀死或中断
  • 你用System.exit(0);
  • 底层虚拟机以其他方式销毁
  • 底层硬件在某种程度上无法使用

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

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

2022-08-20