在Java里如何捕获多个异常_Java多异常捕获说明
发布时间 - 2026-01-29 00:00:00 点击率:次Java 7+ 支持用 | 在单个 catch 中捕获多个互不继承的异常,共享处理逻辑;异常变量类型为各类型的最小公共父类,不可调用子类特有方法,且禁止父子类共存以避免语义冗余与字节码歧义。
Java 7+ 的多异常捕获语法:用 | 分隔多个异常类型
Java 7 引入了在单个 catch 子句中捕获多种异常的语法,前提是这些异常之间不能是父子关系(即不能有继承关系)。编译器会检查并拒绝 catch (IOException | SQLException e) 这类写法中若 SQLException 继承自 IOException(实际不是),但若写成 catch (Exception | RuntimeException e) 就会报错——因为后者是前者的子类。
这种写法本质是让多个异常共享同一段错误处理逻辑,适合「错误恢复方式一致」的场景,比如统一记录日志、关闭资源、返回默认值等。
- 必须使用
final或 effectively final 的异常参数(不能在catch块里重新赋值给e) - 异常变量
e的静态类型是所有列出类型的最小公共父类(如IOException | SQLException→ 编译时类型为Exception) - 无法在块内调用子类特有方法(例如不能直接调用
e.getSQLState()),需先用instanceof判断
try {
doSomething();
} catch (IOException | SQLException e) {
logger.error("I/O or DB error occurred", e);
rollback();
}
为什么不能捕获 Exception 和它的子类?
编译器禁止在同一个 catch 中写 catch (Exception | RuntimeException e),因为这违反了异常处理的语义层级:子类异常已经被父类覆盖,冗余声明无意义,且可能掩盖意图。
更关键的是,JVM 字节码层面每个 catch 块对应一个异常表条目,而多异常捕获会被编译为多个独立条目(但共享代码偏移),若允许父子类共存,会导致匹配顺序歧义和不可预测的行为。
- 错误示例:
catch (Exception | NullPointerException e)→ 编译失败,提示 “alternative exception types must be disjoint” - 正确替代:把更具体的异常放在前面单独
catch,通用的放后面(传统多catch链) - 如果真需要区分处理,就不要强行合并——多写一行
catch比加运行时判断更清晰、更安全
传统多 catch 链 vs 多异常捕获:选哪个?
两者不是互斥替代,而是不同关注点的工具。多异常捕获解决的是「相同处理逻辑」的重复代码问题;而多 catch 链解决的是「差异化响应」问题。
- 用多异常捕获:日志记录、资源清理、返回兜底值等通用操作
- 用多
catch链:需要重试网络请求(SocketTimeoutException)、解析错误转用户提示(JSONException)、权限异常跳登录页(SecurityException)等 - 性能上无差异:多异常捕获只是语法糖,编译后仍是多个异常表项
- 可混用:一个
try后跟多个catch,其中某个可以是多异常形式
try {
processRequest();
} catch (IOException | SQLException e) {
notifyAdmin(e);
throw new ServiceException("Backend failed", e);
} catch (IllegalArgumentException e) {
// 参数校验失败,不通知 admin,直接返回 400
response.sendError(400, "Invalid input");
}
容易被忽略的兼容性与调试陷阱
多异常捕获是 Java 7+ 特性,但很多团队仍在维

- 构建脚本中务必确认
sourceCompatibility = 1.7(Gradle)或(Maven)1.7 - 日志中打印异常时,
e.getClass().getName()仍返回实际抛出的类型(如java.io.FileNotFoundException),不是联合类型 - 单元测试要分别覆盖每种异常路径——不能只测其中一个,就认为多异常捕获逻辑已验证
- 静态分析工具(如 SonarQube)可能误报“异常类型未被处理”,需检查是否遗漏了未列在
catch中的受检异常
真正麻烦的从来不是语法怎么写,而是你得清楚哪几种异常确实该被一视同仁地处理,而不是为了少写两行 catch 把业务语义揉在一起。
# java
# js
# json
# 字节
# 工具
# 栈
# ai
# eclipse
# 为什么
# red
# maven
# jvm
# 父类
# 子类
# try
# catch
# 变量类型
# 继承
# 堆
# ide
# gradle
# bug
# 多个
# 的是
# 就会
# 放在
# 能在
# 而不
# 这类
# 仍是
# 能有
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Java垃圾回收器的方法和原理总结
装修招标网站设计制作流程,装修招标流程?
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
如何在腾讯云服务器上快速搭建个人网站?
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
Python数据仓库与ETL构建实战_Airflow调度流程详解
Laravel如何使用Blade模板引擎?(完整语法和示例)
高端建站如何打造兼具美学与转化的品牌官网?
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
Laravel定时任务怎么设置_Laravel Crontab调度器配置
网站建设保证美观性,需要考虑的几点问题!
韩国服务器如何优化跨境访问实现高效连接?
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
lovemo网页版地址 lovemo官网手机登录
如何在不使用负向后查找的情况下匹配特定条件前的换行符
iOS正则表达式验证手机号、邮箱、身份证号等
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
如何挑选最适合建站的高性能VPS主机?
潮流网站制作头像软件下载,适合母子的网名有哪些?
北京网站制作的公司有哪些,北京白云观官方网站?
如何安全更换建站之星模板并保留数据?
使用spring连接及操作mongodb3.0实例
linux top下的 minerd 木马清除方法
如何在IIS中配置站点IP、端口及主机头?
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
如何在 React 中条件性地遍历数组并渲染元素
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
如何用AWS免费套餐快速搭建高效网站?
EditPlus中的正则表达式实战(6)
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
Python文件流缓冲机制_IO性能解析【教程】
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
如何续费美橙建站之星域名及服务?
如何用y主机助手快速搭建网站?
js实现点击每个li节点,都弹出其文本值及修改
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
如何确保FTP站点访问权限与数据传输安全?
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
Laravel如何为API编写文档_Laravel API文档生成与维护方法

