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
的子类,所以这个写法就相当于把子类包含在了父类中,编译器会报错:
javaTypes 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 ) |
场景 | 多种异常处理逻辑一致时使用 |