异常和错误报告顺序
Posted
技术标签:
【中文标题】异常和错误报告顺序【英文标题】:Exceptions and errors report order 【发布时间】:2011-11-23 17:50:56 【问题描述】:哪些规则适用于以下代码:
try
assert (false) : "jane";
catch (Exception e2)
System.out.print("ae2 ");
finally
throw new IllegalArgumentException();
资产已启用。
为什么会报告 IllegalArgumentException 而不是 AssertionError?是否有适用于这种情况的规则?
编辑: 对不起!在这个例子中应该有 assert (false)
【问题讨论】:
【参考方案1】:finally
块始终运行。 assert
的计算结果为 true,因此 finally
块会引发异常。
此外,无论如何默认情况下都禁用断言,这可能是断言从未得到评估的原因。
附言
如果assert
评估为假,finally
将继续运行并抛出异常,而不是 AssertionError
。
请记住,finally
块始终运行,除非 JVM 在 try
块中停止。
【讨论】:
assert
不返回任何内容。
好的,准确地说是评估。【参考方案2】:
finally
块(或catch
块)中的未捕获异常会导致try
块中的任何异常被丢弃。有关详细信息,请参阅Java Language Specification § 14.20。从 Java 7 开始,封闭的 try/catch 块可以恢复丢弃的异常(如 here 所述)。
【讨论】:
【参考方案3】:唯一能做任何事情的行是
throw new IllegalArgumentException();
而
assert true
什么都不做,即使做了也不会被catch(Exception
抓到
【讨论】:
在这种情况下,答案是 finally 总是最后执行并替换除System.exit();
之外的任何先前操作【参考方案4】:
finally
块将始终被执行。它不会执行的唯一情况是JVM关闭(即System.exit(-)
。)
你可能会觉得有趣的是,即使你有:
try
return ...;
finally
...
finally 块仍然会被执行,并且会在方法退出之前执行。
【讨论】:
感谢您的回答。我第一次在 *** 遇到来自 PUT 的人;) 哈,很高兴在这里找到大学同学 ;-) 祝你的 SCJP 好运。 谢谢,我以 95% 的成绩通过了今天的考试;)以上是关于异常和错误报告顺序的主要内容,如果未能解决你的问题,请参考以下文章
C++/Windows:如何报告内存不足异常(bad_alloc)?
如何向 $.ajax 报告错误而不在 MVC 控制器中引发异常?