精通 Java 多异常捕获:单 catch 块处理多异常
精通 Java 多异常捕获
发现如何用单个 catch 块捕获多个异常、精简代码并避免常见陷阱。
Java 7 前,开发者需为每种异常类型编写单独 catch 块,即使处理逻辑相同。
考虑以下场景。
示例 1:分离的 catch 块
class Main { public static void main(String[] args) { try { int[] array = new int[10]; array[10] = 30 / 0; } catch (ArithmeticException e) { System.out.println(e.getMessage()); } catch (ArrayIndexOutOfBoundsException e) { System.out.println(e.getMessage()); } } }
输出
/ by zero
此例可能出现两个不同问题:
ArithmeticException—— 除零。ArrayIndexOutOfBoundsException—— 在 10 元素数组访问索引 10。
两个 catch 执行相同动作,导致代码重复。
单个 catch 块捕获多异常
Java SE 7 起,可用竖线(|)分隔符将多异常类型合并到一个 catch 块。
语法:
try { // code } catch (ExceptionType1 | ExceptionType2 ex) { // handler }
示例 2:多异常 catch 块
class Main { public static void main(String[] args) { try { int[] array = new int[10]; array[10] = 30 / 0; } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) { System.out.println(e.getMessage()); } } }
输出
/ by zero
合并处理器后,代码更整洁、字节码更小、维护更易。
注意: 多异常 catch 中参数隐式为 final,不可重新赋值。
使用基类异常
若多个捕获异常共享共同祖先,可捕获祖先而非列出每个子类。
示例 3:捕获基类 Exception
class Main { public static void main(String[] args) { try { int[] array = new int[10]; array[10] = 30 / 0; } catch (Exception e) { System.out.println(e.getMessage()); } } }
输出
/ by zero
因 Java 中所有特定异常均继承 Exception,单一 catch 块处理上述所有场景。
若基类异常已被捕获,在同一 catch 包含其子类会触发编译错误。
示例 4:基类与子类异常的非法组合
class Main { public static void main(String[] args) { try { int[] array = new int[10]; array[10] = 30 / 0; } catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) { System.out.println(e.getMessage()); } } }
输出
Main.java:6: error: Alternatives in a multi-catch statement cannot be related by subclassing
此错误因 ArithmeticException 和 ArrayIndexOutOfBoundsException 是 Exception 子类,违反语言规则。
java
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java 异常处理:try-catch-finally 与资源管理
- Java throw 与 throws 深度解析:异常处理实战指南
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- 深入理解 Java Vector:用法、特性及与 ArrayList 的对比