什么是被抑制的异常?

新手上路,请多包涵

评论(用户 soc )对 尾调用优化问题回答 提到 Java 7 有一个称为“抑制异常”的新功能,因为“添加了 ARM”(支持 ARM CPU?)。

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

原文由 Raedwald 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 810
2 个回答

我相信评论者指的是一个异常,当它在 try-with-resources 块的隐式 finally 块中抛出时被半忽略,在从 try 抛出的现有异常的上下文中 --- 块:

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

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

原文由 Jon Skeet 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

原文由 John B 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题