Java编译器静态检查catch块可达性,通过继承关系判定异常类型是否重复或重叠,多异常捕获同样适用该机制。

编译器按顺序扫描,静态判定可达性
Java编译器(javac)在解析catch块时,并不运行代码,而是逐行检查每个catch参数类型与前面所有已声明catch类型的继承关系。一旦发现当前catch的异常类型是之前某个catch类型的子类或相同类型,就立即报错:error: exception XXX has already been caught。这个过程发生在语法分析和语义检查阶段,属于静态编译期约束。
类型兼容性检查基于继承图而非运行时实例
编译器内部维护着Java异常类的继承拓扑结构(如FileNotFoundException → IOException → Exception → Throwable)。对每个catch声明,它会向上遍历该异常的所有父类,再横向比对已出现过的catch类型。只要任一祖先类型已在前序catch中出现,当前catch就被视为不可达。
IDES的实时提示本质是复现编译逻辑
IntelliJ IDEA、Eclipse等工具内置了与javac一致的类型检查引擎。你在编辑时看到的“Unreachable catch block”高亮或灯泡提示,不是启发式猜测,而是调用了和命令行编译器完全相同的可达性分析算法。它们甚至能提前标出尚未保存的非法顺序,因为判断只依赖源码文本和标准库类型定义。
多异常捕获(|语法)同样受此机制约束
使用catch(IOException | SQLException e)时,编译器会对竖线分隔的每种类型两两做继承关系检查。若任意两者存在父子关系(如IOException | FileNotFoundException),就会报错:error: alternative exception types must be disjoint。这说明检测逻辑统一覆盖单catch和multi-catch两种语法形式。
立即学习“Java免费学习笔记(深入)”;


















