4

哪些规则适用于以下代码:

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

资产已启用。

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

编辑: 对不起!在这个例子中应该有 assert ( false )

4

4 回答 4

6

finally块总是运行。计算结果assert为真,因此该finally块引发异常。

此外,无论如何默认情况下都禁用断言,这可能是断言从未被评估的原因。

ps

如果assert计算结果为 false,finally则无论如何都会运行并抛出异常,而不是AssertionError.

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

于 2011-11-23T17:53:07.813 回答
1

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

于 2011-11-23T18:02:55.083 回答
0

唯一能做任何事情的线是

throw new IllegalArgumentException();

然而

assert true

什么都不做,即使做了也不会被抓住catch(Exception

于 2011-11-23T17:54:21.677 回答
0

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

您可能会发现有趣的是,即使您有:

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

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

于 2011-11-23T18:10:53.293 回答