194. Java 异常 - Java 异常处理之多重捕获

194. Java 异常 - Java 异常处理之多重捕获


🎯 多重捕获是什么?

在 Java 7 之后,我们可以使用一个 catch 块来同时捕获多个不同类型的异常 ,这就是**多重捕获(multi-catch)**语法。

✅ 为什么需要它?

  • 减少重复代码 ✅
  • 避免"图省事直接捕获 Exception"的诱惑 ⚠️
  • 提高代码可读性和维护性 📖

✍️ 基本语法格式

java 复制代码
try {
    // 可能抛出 IOException 或 SQLException
} catch (IOException | SQLException ex) {
    logger.log(ex);
    throw ex; // 注意:ex 是 final 变量
}

📌 说明:

  • 用 | 分隔多个异常类型
  • ex 是这几个异常的共同父类型(它们必须无继承关系!)

👀 注意事项详解

1. ❗ 参数是隐式 final

java 复制代码
catch (IOException | SQLException ex) {
    ex = new IOException(); // ❌ 编译错误:ex 是 final,不可赋值
}

因为 JVM 无法判断到底是哪种类型,所以为了安全,它不允许你修改这个变量。


2. ❗ 异常类型必须彼此独立(disjoint)

java 复制代码
try {
    // some IO code
} catch (FileNotFoundException | IOException e) {
    // ❌ 编译失败!
}

😱 为什么出错?

因为 FileNotFoundException 是 IOException 的子类,所以这个写法就相当于把子类包含在了父类中,编译器会报错:

java 复制代码
Types in multi-catch must be disjoint

✅ 正确做法是:

java 复制代码
try {
    // some IO code
} catch (FileNotFoundException e) {
    // 专门处理找不到文件
} catch (IOException e) {
    // 处理其他 IO 异常
}

🧪 示例:使用多重捕获减少重复

java 复制代码
try {
    if (Math.random() > 0.5) {
        throw new IOException("IO problem");
    } else {
        throw new SQLException("DB issue");
    }
} catch (IOException | SQLException ex) {
    System.err.println("出问题了:" + ex.getMessage());
    ex.printStackTrace();
}

📌 实际应用场景:

当多个异常类型的处理逻辑完全一致时,多重捕获就非常实用!


  • "multi-catch 就像一个'全能守门员',可以用一个人守多个球门,但这些球门不能重叠。"
  • "如果你的处理逻辑是一模一样的,不如就合在一个 catch,用 | 分隔,清爽又高效!"
  • "不过别贪心,不能把父子类一起塞进来,那会出错!"

🎓 小结归纳:

特性 说明
语法 catch (AException
参数 final catch 参数是隐式 final,不能赋新值
限制 异常类型之间不能有继承关系(必须 disjoint)
场景 多种异常处理逻辑一致时使用
相关推荐
花开盛夏^.^36 分钟前
电脑打开多个浏览器Web窗口占用较大的运行内存的原因
前端·浏览器
馒头不想说话2 小时前
实体店老板的24小时AI运营员工,写、剪、发全自动,省下一整个团队工资
前端
ZhengEnCi2 小时前
Agent 规则管理:让 Memory 做索引、让 Skill 存规则——上下文上限实测与分工方案
后端
nice_lcj5202 小时前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
骑着蜗牛撵大象3273 小时前
2026 后端 AI 工程化:Spring AI 管调用、MCP 管工具、Agent 内嵌管自治
java·人工智能·后端·spring·ai·可观测性·mcp
摸爬滚打的小李3 小时前
Spring XML + WAR + Tomcat 项目启动
后端
椒哥4 小时前
一天被问几十次"允许",我统计了 517 次,然后写了个插件
前端·javascript·github
风骏时光牛马4 小时前
生成一个AI稳定性治理及疑难问题分析标题,只需要一个标题,不需要其他的任何文本。
前端
莫西干式秃头4 小时前
用 AI + threejs 写了个浏览器里的 3D 动作游戏《武来》:砍怪、放技能、开 SU7
前端·人工智能·three.js
kyriewen4 小时前
我测了 6 种防请求竞态的写法:只有 1 种真能打
前端·javascript·程序员