1

我有一个try... catch...finally块,它catch重新抛出异常:

try
{
    startBombCountdownAndRunAsFastAsYouCan();
}
catch (BombExplodedOnYourFaceException ex)
{
    displayMessage("Hahaha! It blew up on your face!");
    throw ex;
}
finally
{
    cleanFloor();
}

displayMessage("Wow, you pulled it off!");

cleanFloor()在这个例子中,无论是否抛出异常,我都需要执行它。那么问题来了:不管是否在对应的子句中重新抛出异常,该finally子句是否总是catch被执行?

4

3 回答 3

5

是的,这正是创建 finally 概念的确切目的。

于 2011-03-11T18:05:09.323 回答
2

是的,finally 块将始终被执行。

另外,作为旁注,如果你不打算使用显式捕获的异常,你应该只使用“catch { ... throw; }。

以供参考:

http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx

于 2011-03-11T18:12:23.683 回答
2

通常执行,但finally并非总是执行

考虑以下 Java 程序,其中finally未执行该块:

package test;
public class TestFinally {
    public static void main(String[] args) {
        try {
            throw new Exception ("throw!");
        }
        catch(Exception ex) {
            System.out.println("catch!");
            System.exit(0);
        }
        finally {
            System.out.println("finally!");
        }       
    }
}

它输出:

catch!

finally catch 只有在控制权返回给 时才会执行catch,正如我们所见,这永远无法保证;确定是否执行finally基本上减少到Halting Problem

在实践中,通常会执行该finally块。并非总是如此


Peter Norvig 的Java IAQ:不经常回答的问题对此有一点:

问:finally 子句中的代码永远不会执行失败,对吧?

好吧,几乎从来没有。但这里有一个例子,不管布尔选择的值如何,finally 代码都不会执行:

try {
    if (choice) {
        while (true) ;
    } else {
        System.exit(1);
    }
} finally {
    code.to.cleanup();
}
于 2011-03-11T18:41:46.707 回答