java 7 及以上版本支持在单个 catch 块中捕获多个异常,只需在括号内用竖线 | 分隔异常类型即可。这种方式能显著减少重复代码,但要求被捕获的多个异常之间不能有继承关系,且该 catch 块内的参数变量会自动视为 final,不可重新赋值。

如何编写多异常捕获的代码结构
实现多异常捕获时,将需要统一处理的异常类名放在 catch 关键字后的括号中,中间以 | 连接。编译器会检查这些异常是否属于同一层级或互不相关,若存在继承关系(如同时捕获 Exception 和 RuntimeException),编译将报错。处理逻辑写在块内,可复用相同的恢复或日志记录代码。

try {
// 可能抛出 IOException 或 NullPointerException 的代码
processInput();
} catch (IOException | NullPointerException e) {
System.out.println("发生错误: " + e.getMessage());
}
多异常捕获对局部变量的影响
在多异常捕获块中,异常参数被视为隐式 final。这意味着你不能在块内对该参数进行重新赋值操作,例如 e = new Exception() 会导致编译错误。这是为了确保在捕获多种异常类型时,参数的引用始终指向最初抛出的那个异常对象,保持语义一致性。

try {
riskyOperation();
} catch (IOException | SQLException e) {
// e 是 final 的,下面这行会编译失败
// e = null;
logError(e);
}
基于输入条件判断具体捕获了哪种异常
虽然 catch 块统一处理了多种异常,但在实际业务中可能需要针对不同类型的异常执行不同的逻辑。可以通过 instanceof 检查或调用 getClass().getName() 来区分当前捕获的具体异常类型,从而执行差异化的处理策略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











