例外和错误报告顺序

时间:2011-11-23 17:50:57

标签: java scjp open-closed-principle

以下代码适用哪些规则:

    try {
        assert (false) : "jane";
    } catch (Exception e2) {
        System.out.print("ae2 ");
    } finally {
        throw new IllegalArgumentException();
    }

已启用资产。

为什么报告IllegalArgumentException而不是AssertionError?在这种情况下是否有适用的规则?

修改 抱歉!在这个例子中应该有断言(错误

4 个答案:

答案 0 :(得分:6)

finally块始终运行。 assert的计算结果为true,因此finally块会抛出异常。

此外,默认情况下默认禁用断言,这可能是断言永远不会被评估的原因。

P.S

如果assert评估为false,则finally仍将运行并抛出异常,而不是AssertionError

记住finally块始终运行,除非JVM在try块中停止。

答案 1 :(得分:1)

finally块(或catch块)中未捕获的异常会导致try块中的任何异常被丢弃。有关详细信息,请参阅Java Language Specification § 14.20。从Java 7开始,封闭的try / catch块可以恢复丢弃的异常(如here所述)。

答案 2 :(得分:0)

唯一能做任何事情的行是

throw new IllegalArgumentException();

,而

assert true

没有做任何事情,即使这样做也不会被catch(Exception

抓住

答案 3 :(得分:0)

始终会执行finally块。 不会执行的唯一情况是JVM关闭(即System.exit(-)。)

你可能会觉得有趣的是,即使你有:

try { 
    return ...; 
} 
finally { 
    ...
}

finally块仍然会被执行,并且在>方法退出之前将执行