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

Java中抛出Exception2为何Exception1/2捕获块提示不可达?

Java中catch块提示“不可达”的原因解析

先看你提供的代码:

public class App {
    public static void main(String[] args) throws Exception {
        int x = 0;
        try {
            throw new Exception2();
        }
        catch (Exception e) {x += 1;}
        catch (Exception1 e) {x += 2;}
        catch (Exception2 e) {x += 3;}
    }
}


class Exception1 extends Exception {

}

class Exception2 extends Exception1 {

}

出现“不可达”错误的核心原因是Java异常捕获的匹配顺序和父类异常的覆盖特性:

  1. 异常捕获的顺序规则:Java会从上到下依次检查try块抛出的异常是否匹配当前catch块的异常类型,一旦匹配成功就会执行该catch块,后续的catch块不会再被处理。
  2. 父类异常的覆盖能力:Exception是所有异常的父类,Exception1继承自Exception,Exception2又继承自Exception1。所以第一个catch(Exception e)可以捕获所有类型的异常,包括你抛出的Exception2。
  3. 编译器的可达性检查:Java编译器会分析代码执行路径,当判定某个代码块永远不可能被执行时,就会标记为“不可达”。这里后面两个catch块永远没有被执行的机会,所以触发了这个错误。

简单说就是:前面的父类异常catch块把所有可能的异常都截胡了,后面的子类异常catch块根本轮不上执行,编译器直接给你报错提示。

如果想让代码符合预期,应该把更具体的异常catch块放在前面,调整后的代码如下:

public class App {
    public static void main(String[] args) throws Exception {
        int x = 0;
        try {
            throw new Exception2();
        }
        catch (Exception2 e) {x += 3;}
        catch (Exception1 e) {x += 2;}
        catch (Exception e) {x += 1;}
    }
}

这样抛出Exception2时,会优先匹配第一个catch(Exception2)块,执行x +=3,符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:47:16