java捕获多个异常有三种方式:一是多catch块,须子类在前父类在后;二是java 7+多异常捕获(|分隔,类型不可继承);三是统一用exception/throwable(慎用,仅限顶层兜底),并推荐结合try-with-resources管理资源。

Java 中可以通过多种方式在 try-catch 中捕获多个异常,核心在于合理组织 catch 块或利用语法特性,避免遗漏、重复或低效处理。
用多个 catch 块分别捕获不同异常
这是最常用也最清晰的方式:每个 catch 块对应一种异常类型,按“子类在前、父类在后”的顺序排列,否则编译报错。
- 例如:IOException 和 SQLException 是并列的检查型异常,可各自独立 catch
- 若同时想处理 NullPointerException(运行时异常)和 IOException,也应分开写,不强制要求声明 throws
- 注意顺序:不能把 Exception 放在 IOException 前面,否则后者永远无法到达
用多异常捕获(multi-catch)语法(Java 7+)
当多个异常需要执行**完全相同**的处理逻辑时,可用竖线 | 连接异常类型,写在一个 catch 中。
- 语法示例:catch (IOException | SQLException e)
- 被 | 分隔的异常必须互不继承(不能是父子关系),否则编译失败
- e 的类型在该 catch 块内是这些异常的**最小公共父类**(如 Exception),不能调用子类特有方法
统一用 Exception 或 Throwable 捕获(慎用)
虽然可以只写 catch (Exception e) 或 catch (Throwable t) 来兜底所有异常,但实际开发中不推荐无差别捕获。
- 会掩盖具体问题,不利于定位和分策略处理(比如网络超时 vs 文件不存在)
- 可能意外吞掉 Error(如 OutOfMemoryError),影响系统稳定性
- 适合场景仅限于顶层日志记录或统一错误响应,且通常应配合重新抛出或转换为业务异常
结合 finally 或 try-with-resources 管理资源
捕获多个异常时,别忘了资源清理。优先使用 try-with-resources(自动关闭实现了 AutoCloseable 的资源),它本身也能处理关闭过程中的异常(抑制异常机制)。
- 如果手动关流,建议在 finally 中关闭,并对 close() 调用再套一层 try-catch 防止覆盖主异常
- try-with-resources 在 Java 7+ 中支持一次声明多个资源,用分号隔开,异常处理更干净
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











