OCP Java SE 8教材异常题疑惑:为何出现被抑制异常?
问题
在Kathy Sierra所著《OCP Java SE 8 Programmer II》第203页的第9题中,正确选项为D:“无被抑制异常的RuntimeException c”。但运行以下代码时,添加指定代码后输出会包含被抑制的RuntimeException "a"和主异常IOException,这看起来和选项描述矛盾,请问我忽略了什么要点?
原代码:
import java.io.Closeable; import java.io.IOException; public class Animals { class Lamb implements Closeable { public void close() { throw new RuntimeException("a"); } } public static void main(String[] args) { new Animals().run(); } public void run() { try (Lamb l = new Lamb();) { throw new IOException(); } catch (Exception e) { throw new RuntimeException("c"); } } }
添加至catch块的代码:
System.out.println("catch main: " + e); for (Throwable t : e.getSuppressed()) { System.out.println("catch suppressed " + t); }
解答
你混淆了catch块捕获到的异常e和**最终抛出的RuntimeException "c"**这两个完全不同的异常:
- try-with-resources执行流程中,try块抛出IOException后,JVM会自动调用Lamb的close()方法,close()抛出的RuntimeException "a"会被附加到IOException上作为被抑制异常,此时catch块捕获到的就是这个携带了被抑制异常的IOException。
- 但catch块里直接抛出了一个全新的RuntimeException "c",这个新异常和之前的IOException没有任何关联,JVM不会自动把IOException的被抑制异常转移到这个新异常上。
- 你添加代码后看到的被抑制异常"a"和IOException,是打印的catch块捕获到的e的信息,而非最终程序终止时抛出的RuntimeException "c"的信息。题目选项D描述的是最终抛出的RuntimeException "c"——它确实没有任何被抑制异常,这和代码运行的实际结果并不矛盾。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

