java多重catch必须按“子类在前、父类在后”顺序排列,否则编译报错;每个catch独立作用域,可重用变量名e;建议针对性处理异常,避免空catch;checked异常仍需throws声明,unchecked异常无需但可捕获;java7+支持multi-catch(如catch(ioexception|sqlexception e)),但不能合并父子类异常。

Java 中编写多重 catch 块的关键是按“子类在前、父类在后”的顺序排列,否则编译器会报错——因为更宽泛的异常类型会提前捕获所有子类异常,导致后续 catch 失效。
catch 块必须按继承关系从具体到宽泛排列
比如同时处理 NumberFormatException、ArrayIndexOutOfBoundsException 和通用的 RuntimeException,必须把前两者写在前面,最后放 RuntimeException:
-
NumberFormatException是IllegalArgumentException的子类,而后者又属于RuntimeException - 如果把
RuntimeException放第一个,后面两个 catch 就永远无法执行,编译直接拒绝 - 正确顺序示例:
catch (NumberFormatException e)→catch (ArrayIndexOutOfBoundsException e)→catch (RuntimeException e)
可以共用一个 try,但每个 catch 只处理一种异常类型
一个 try 块后可跟多个 catch,每个 catch 对应一个异常类(不能写多个类型用逗号分隔,那是 multi-catch 的写法,另说):
- 每个 catch 块独立作用域,变量名可重复(如都用
e) - 建议在每个 catch 中做有针对性的操作:记录日志、返回友好提示、尝试降级逻辑等
- 避免空 catch 或只打印堆栈却不处理——这会让问题隐藏
注意 checked 异常和 unchecked 异常的差异
多重 catch 不影响编译检查规则:
-
IOException这类 checked 异常,即使你写了 catch,方法签名仍需声明throws(除非已捕获并处理) -
NullPointerException等 unchecked 异常无需声明,但写 catch 同样有效 - 若 try 块中抛出多个 checked 异常(如
IOException和SQLException),每个都得有对应 catch 或统一向上抛
Java 7+ 支持 multi-catch,简化写法
当多个异常需要执行相同处理逻辑时,可用竖线 | 合并:
- 写法:
catch (IOException | SQLException e) - 注意:这些异常类不能是彼此的父子类(如不能写
Exception | RuntimeException) - 合并后变量
e类型是它们的最近公共父类(如上例是Exception),不能调用子类特有方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











