什么是禁止显示的异常?

关于尾部调用优化问题的答案的评论(由用户soc)提到Java 7具有一个名为“抑制异常”的新功能,因为“增加了ARM”(支持ARM CPU?

在这种情况下,什么是“抑制的例外”?在其他情况下,“抑制异常”将是捕获然后忽略的异常(很少是一个好主意);这显然是不同的。


答案 1

为了澄清 Jon 答案中的引用,一个方法(每次执行)只能引发一个异常,但在 的情况下,可以引发多个异常。例如,一个可能被抛出到块中,另一个可能被抛出由 提供的隐式。try-with-resourcesfinallytry-with-resources

编译器必须确定“真正”抛出哪一个。它选择抛出显式代码(块中的代码)中引发的异常,而不是隐式代码(块)引发的异常。因此,隐式块中引发的异常将被抑制(忽略)。这仅在出现多个异常的情况下发生。tryfinally


答案 2

我相信评论者所指的异常是一个异常,当它被抛出在资源试用块的隐式块中时,在从块中抛出的现有异常的上下文中时,它被半忽略:finallytry

可以从与 try-with-resources 语句关联的代码块中引发异常。在示例 writeToFileZipFileContents 中,可以从 try 块引发异常,并且当它尝试关闭 ZipFile 和 BufferedWriter 对象时,try-with-resources 语句最多可以引发两个异常。如果从 try 块引发异常,并且从 try-with-resources 语句引发一个或多个异常,则从 try-with-resources 语句引发的那些异常将被抑制,并且该块引发的异常是由 writeToFileZipFileContents 方法引发的异常。可以通过从 try 块引发的异常中调用 Throwable.getSuppressed 方法来检索这些被禁止的异常。

(这是引用链接页面中名为“抑制的异常”的部分。


推荐