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

Java SE 8 OCA考试:为何第二个catch块被忽略?

为什么第二个catch块没有被执行?

先看你的代码:

public static void main(String... a) {
    System.out.print("a");
    try {
        System.out.print("b");
        throw new IllegalArgumentException("1");
    } catch (IllegalArgumentException e) {
        System.out.println("c");
        throw new RuntimeException("1");
    } catch (RuntimeException e) {
        System.out.println("d");
        throw new RuntimeException("2");
    } finally {
        System.out.print("e");
        throw new RuntimeException("3");
    }
}

你的错误核心是对try-catch执行逻辑的误解:同一个try块对应的catch块,只会匹配try块本身抛出的异常;catch块内部抛出的新异常,不会被当前try-catch结构里的其他catch块捕获。

下面是完整的执行流程:

  • 执行System.out.print("a"),输出a
  • 进入try块,执行System.out.print("b"),输出b
  • 抛出IllegalArgumentException("1"),该异常属于try块抛出的异常,进入匹配流程
  • 第一个catch (IllegalArgumentException e)捕获到异常,执行System.out.println("c"),输出c
  • 在第一个catch块内抛出RuntimeException("1"),这个新异常不会回到当前try-catch结构匹配第二个catch块,而是直接触发finally块执行
  • 进入finally块,执行System.out.print("e"),输出e
  • finally块内抛出RuntimeException("3"),该异常会覆盖之前的RuntimeException("1"),最终程序抛出此异常终止

所以实际输出是abce加上最终的异常信息,而非你预想的abcde。

简单总结:catch块的作用是处理try块的异常,catch块自身抛出的异常不属于当前try块的异常流程,不会被同层级其他catch块处理,会直接执行finally块后向上抛出。

内容的提问来源于stack exchange,提问作者Rty Euzch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:47:09