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

jax*_*jax 132 java exception-handling

在这个代码中,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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Gar*_*ryF 172

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

  • 运行try-catch-finally块的线程被终止或中断
  • 你用 System.exit(0);
  • 底层VM以其他方式被破坏
  • 底层硬件在某些方面无法使用

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

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

  • 你在这里的意思是"运行try-catch-finally块的线程被中断"?也许该文档措辞不佳,但Thread.interrupt()不会导致finally块被跳过,无论是从try块还是catch块抛出.这是否使用"中断"来表示更暴力的东西,比如Thread.stop()? (4认同)

fro*_*die 10

是.

查看文档:

当try块退出时,finally块总是执行.

例外:

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


小智 5

最后,块总是执行。

public class ExceptionTest {

public static void someFunction(String input) throws Exception {
    try {
        if( input.equals("ABC") ) {
            System.out.println("Matched");
        }
    } catch (Exception e) {
        throw new Exception(e);
    } finally {
        System.out.println("Input Is "+input+" Finally Executed!!!");
    }
}

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
        System.out.println("********* Test with VALUE ********* ");
        someFunction("ABC");
        System.out.println("\r\n********* Test with NULL  ********* ");
        someFunction(null);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

}

Java Try Catch Final 块和 Throw