Java多重catch块必须按子类异常在前、父类异常在后的顺序排列,否则编译报错;JVM自上而下匹配,首个兼容类型即执行,后续忽略,如FileNotFoundException→IOException→Exception。

Java 中可以使用多个 catch 块依次捕获不同类型异常,每个 catch 块处理一种(或一类)异常,让错误处理更精准、逻辑更清晰。
多重 catch 的基本写法
在同一个 try 语句后,按从具体到宽泛的顺序写多个 catch 块。JVM 遇到异常时,会从上到下匹配第一个能捕获该异常类型的 catch,匹配成功即执行对应块,其余 catch 不再检查。
注意:子类异常必须写在父类异常之前,否则编译报错(如 IOException 必须在 Exception 之前)。
常见写法示例
以下代码演示读取文件时可能遇到的多种异常:
立即学习“Java免费学习笔记(深入)”;
try {
FileReader fr = new FileReader("data.txt");
int data = fr.read();
// ... 其他操作
} catch (FileNotFoundException e) {
System.err.println("文件未找到:" + e.getMessage());
} catch (SecurityException e) {
System.err.println("无访问权限:" + e.getMessage());
} catch (IOException e) {
System.err.println("读取失败:" + e.getMessage());
} catch (Exception e) {
System.err.println("其他未知错误:" + e.getClass().getSimpleName());
}
关键细节和建议
-
顺序很重要:越具体的异常类型越靠前,比如
ArithmeticException在RuntimeException之前,SQLException在Exception之前 -
避免冗余捕获:不要同时写
catch (Exception e)和catch (Throwable t),后者会覆盖前者且通常不应捕获Error -
可合并同类异常(Java 7+):用竖线分隔多个异常类型,写在一个
catch中,例如:catch (IOException | SQLException e) -
资源管理优先考虑 try-with-resources:对实现了
AutoCloseable的资源(如FileReader),推荐用自动关闭方式,减少手动finally或重复close()逻辑
什么时候适合用多重 catch
当一段代码可能抛出几种语义不同、需要分别响应的异常时,比如:
- 网络请求中区分连接超时(
SocketTimeoutException)、拒绝连接(ConnectException)、解析失败(JSONException) - 数据库操作中区分主键冲突(
SQLIntegrityConstraintViolationException)、连接断开(SQLNonTransientConnectionException) - 用户输入校验中区分格式错误(
NumberFormatException)、空值(NullPointerException,虽应尽量避免抛出)


















