java多重catch必须按子类异常在前、父类异常在后的顺序排列,否则编译报错;jvm自上而下匹配首个兼容异常类型并执行对应catch块;java 7+支持用|分隔多异常类型于同一catch中,但类型间不可存在继承关系。

Java 中可以使用多个 catch 块依次捕获不同类型的异常,但必须遵循“子类异常在前、父类异常在后”的顺序,否则编译报错。
多重 catch 的基本写法
一个 try 块后可跟多个 catch 块,每个捕获一种异常类型。JVM 按从上到下的顺序匹配,一旦某个 catch 的参数类型与抛出的异常兼容(即该异常是其类型或其子类),就执行对应块,其余 catch 被跳过。
示例:
try {
int[] arr = new int[3];
arr[5] = 10; // ArrayIndexOutOfBoundsException
String s = null;
s.length(); // 不会执行到这里
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组下标越界:" + e.getMessage());
} catch (NullPointerException e) {
System.out.println("空指针异常:" + e.getMessage());
} catch (Exception e) {
System.out.println("其他异常:" + e.getClass().getSimpleName());
}
注意 catch 的排列顺序
如果把父类异常(如 Exception)写在子类异常(如 IOException 或 SQLException)前面,后续子类 catch 将永远无法到达,编译器会提示 “exception XXX has already been caught”。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 正确:先
FileNotFoundException,再IOException,最后Exception - ❌ 错误:
IOException写在FileNotFoundException前面
Java 7+ 的多异常捕获(同一 catch 处理多种异常)
若多个异常需要执行相同处理逻辑,可用竖线 | 分隔类型,写在一个 catch 中。注意:这些类型必须互不继承,且不能有父子关系。
示例:
try {
// 可能抛出 SQLException 或 IOException
methodThatThrows();
} catch (SQLException | IOException e) {
System.out.println("数据库或IO操作失败:" + e.getMessage());
}
此时 e 是隐式 final,不可重新赋值;类型是所有列出异常的最小公共父类(通常是 Exception)。
配合 try-with-resources 使用更安全
处理资源(如文件、连接)时,建议结合 try-with-resources 自动关闭资源,再用多重 catch 区分业务异常和资源异常:
try (FileInputStream fis = new FileInputStream("test.txt")) {
// 读取操作
} catch (FileNotFoundException e) {
System.err.println("文件未找到");
} catch (SecurityException e) {
System.err.println("无访问权限");
} catch (IOException e) {
System.err.println("读取过程出错");
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










