You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:02:40