Java要求子类异常必须写在父类异常前面,否则编译失败;多catch应按具体到宽泛排列,即业务异常→受检异常→运行时异常→Exception兜底;多异常捕获(|)禁止存在继承关系的类型。

子类异常必须写在父类异常前面,这是 Java 编译器强制要求的规则,不是可选习惯。顺序错了,代码直接编译失败,报错信息通常是“已捕获的异常”或“unreachable catch block”。
继承链决定谁该排最前
Java 异常是类,有明确的父子关系。越靠继承链末端的类越具体、信息越丰富,理应优先处理。
- FileNotFoundException 是 IOException 的子类,必须写在它前面
- SQLException 和 IOException 都继承自 Exception,但彼此无关,顺序可互换
- NullPointerException 是 RuntimeException 的子类,也必须写在它前面
- Exception 是顶层受检异常父类,只能放在所有具体异常之后
- Throwable 是根类,若使用,必须放在最后(一般不建议)
多 catch 块的标准排列结构
实际编码中,推荐按“业务 → 受检 → 运行时 → 兜底”四层组织,每层内部再按继承从具体到宽泛:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 先捕获自定义业务异常(如 UserAlreadyExistsException)
- 再处理标准受检异常(如 SQLException、IOException,各自内部子类靠前)
- 接着是运行时异常(如 IllegalArgumentException、IllegalStateException)
- 最后用 Exception 统一兜底——仅用于日志记录或包装重抛,避免吞掉问题
小心多异常捕获(|语法)的限制
Java 7+ 支持一个 catch 写多个类型,比如 catch (IOException | SQLException e),但有硬性约束:
立即学习“Java免费学习笔记(深入)”;
- 竖线分隔的类型之间不能有继承关系,否则编译报错:“alternative exception types must be disjoint”
- IOException | FileNotFoundException 是非法的,因为后者是前者子类
- 变量 e 的静态类型是这些类型的最近公共父类(通常是 Exception),不能直接调用子类方法
- 若需调用子类特有方法,得先用 instanceof 判断再显式转型
快速判断继承关系的小技巧
不确定两个异常谁是子类、谁是父类时,别猜:
- 在 IntelliJ 中按 Ctrl + Click 跳转到异常类定义,看 extends 后面是谁
- 查 JDK 文档,展开类继承树(Inheritance Tree)
- 记住常见路径:FileNotFoundException ← IOException ← Exception;SQLException ← Exception;NullPointerException ← RuntimeException ← Exception

















