以下代码适用哪些规则:
try {
assert (false) : "jane";
} catch (Exception e2) {
System.out.print("ae2 ");
} finally {
throw new IllegalArgumentException();
}
已启用资产。
为什么报告IllegalArgumentException而不是AssertionError?在这种情况下是否有适用的规则?
修改 抱歉!在这个例子中应该有断言(错误)
答案 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块仍然会被执行,并且在>>方法退出之前将执行。