java中多个catch块必须按“子类在前、父类在后”顺序排列,否则编译不通过;jvm按序匹配首个可捕获异常的块并执行,其余跳过;java 7+支持用“|”合并多种异常类型于单个catch中。

Java 中可以使用多个 catch 块依次捕获不同类型的异常,每个 catch 块处理一种特定异常类型,且必须按“子类在前、父类在后”的顺序排列,否则编译不通过。
多 catch 块的基本写法
一个 try 语句后可跟多个 catch 块,每个块声明自己能处理的异常类型。JVM 在运行时会按顺序匹配第一个能捕获当前抛出异常的 catch 块,匹配成功即执行,其余跳过。
- 多个
catch块之间是互斥关系,只执行其中一个 - 不能有重复或存在继承关系的“父类在前、子类在后”,比如先写
catch(Exception e)再写catch(NullPointerException e)会导致编译错误 - 推荐把更具体的异常(如
NumberFormatException)放在前面,更通用的(如Exception)放在最后兜底
常见异常类型分层捕获示例
例如用户输入字符串转数字并做除法运算,可能触发多种异常:
try {
String input = "abc";
int num = Integer.parseInt(input); // 可能抛 NumberFormatException
int result = 10 / num; // 可能抛 ArithmeticException(除零)
} catch (NumberFormatException e) {
System.out.println("输入不是有效整数:" + e.getMessage());
} catch (ArithmeticException e) {
System.out.println("数学运算错误:" + e.getMessage());
} catch (Exception e) {
System.out.println("其他未预期异常:" + e.getClass().getSimpleName());
}
这样能精准定位问题原因,比统一用 Exception 捕获更利于调试和用户体验。
注意 catch 块的顺序与继承关系
Java 异常体系中,子类异常更具体,应优先捕获。比如:
-
IOException是Exception的子类,所以catch(IOException e)必须在catch(Exception e)之前 -
FileNotFoundException是IOException的子类,若同时想单独处理它,需排在IOException前面 - 如果顺序写反,编译器会报错:“已捕获的异常” —— 因为前面的父类
catch已覆盖了后面子类的范围
替代方案:多异常类型单 catch(Java 7+)
如果多个异常类型需要执行相同处理逻辑,可用“或”语法合并写在一个 catch 中:
try {
// 可能抛出 IOException 或 SQLException
} catch (IOException | SQLException e) {
System.err.println("I/O 或数据库操作失败:" + e.getMessage());
}
这种写法简洁,但无法区分具体异常类型做差异化处理;需要区分时,仍推荐分开写多个 catch 块。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











