Java 异常和错误报告顺序
以下代码适用哪些规则:Java 异常和错误报告顺序,java,scjp,open-closed-principle,Java,Scjp,Open Closed Principle,以下代码适用哪些规则: try { assert (false) : "jane"; } catch (Exception e2) { System.out.print("ae2 "); } finally { throw new IllegalArgumentException(); } 已启用资产 为什么报告IllegalArgumentException而不是AssertionError?在这种情况下是否有适
try {
assert (false) : "jane";
} catch (Exception e2) {
System.out.print("ae2 ");
} finally {
throw new IllegalArgumentException();
}
已启用资产
为什么报告IllegalArgumentException而不是AssertionError?在这种情况下是否有适用的规则
编辑:
很抱歉在本例中,应该有assert(false)
最后
块始终运行。assert
的计算结果为true,因此finally
块抛出异常
另外,断言在默认情况下是禁用的,这可能是断言从未得到评估的原因
p、
如果assert
的计算结果为false,finally
仍将运行并抛出异常,而不是AssertionError
记住
最后
块始终运行,除非JVM在try
块中停止。执行任何操作的唯一一行是
throw new IllegalArgumentException();
鉴于
assert true
不做任何事情,即使它做了,也不会被
捕获(异常最终块(或捕获块)中未捕获的异常捕获)导致来自try
块的任何异常被丢弃。有关详细信息,请参阅。从Java 7开始,封闭的try/catch块可以恢复丢弃的异常(如所述)。始终会执行最后的块。不会执行的唯一情况是JVM关闭(即系统退出(-)
)
你可能会发现有趣的是,即使你有:
try {
return ...;
}
finally {
...
}
finally块仍将执行,并将在方法退出之前执行。assert
不会返回任何内容。好的,确切地说,我会说是evaluates。谢谢你的回答。我第一次在Stackoverflow遇到来自PUT的人;)哈,很高兴在这里找到大学同学;-)祝你的SCJP好运。谢谢,我以95%的分数通过了今天的考试在这种情况下,答案是finally总是最后执行,并替换除System.exit()之外的任何先前操作代码>