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

时间:2010-11-24 08:49:09

标签: java exception-handling

在这段代码中,即使执行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;
    }
}

6 个答案:

答案 0 :(得分:160)

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

  • 运行try-catch-finally块的线程被终止或中断
  • 您使用System.exit(0);
  • 基础VM以其他方式销毁
  • 底层硬件在某种程度上无法使用

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

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

答案 1 :(得分:9)

是。

请参阅documentation

  

finally块总是执行时   try块退出。

例外:

  

注意:如果JVM在尝试时退出   或者正在执行catch代码   finally块可能无法执行。   同样,如果线程执行   尝试或捕获代码被中断或   杀了,终于阻止了   即使应用程序执行也执行   整体还在继续。

答案 2 :(得分:1)

The finally block always executes when the try block exits。除非你的try或catch中有System.exit(0)。

答案 3 :(得分:1)

是。 finally块始终执行,除非您调用System.exit(),因为它会停止Java VM。

答案 4 :(得分:0)

无论你的情况如何,最后总是被执行,即

  • try-catch-finally block
  • 抛出

对于未经检查的异常,java不强制执行错误处理。 这就是原因,如果在finally块中发生了未经检查的异常然后没有对此进行处理,则不会执行此点(发生错误)之下的代码。

所以我建议总是处理所有可能被检查或取消选中的异常。 这样,无论是否还发生未经检查的异常,您都可以确保最终的代码块也被执行。你在sub nest catch中占有一席之地,最后阻止你完成必要的工作。

答案 5 :(得分:0)

最后,块总是执行。

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();
    }
}

}

Java Try Catch Finally Block with Throw