亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> java

精通 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

此例可能出现两个不同问题:

两个 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

  1. 精通 Java 运算符:类型、语法与实战示例
  2. Java 注释:类型、用法与最佳实践
  3. 精通 Java 增强 for 循环:语法、示例与最佳实践
  4. 精通 Java 字符串:创建、方法与最佳实践
  5. 精通 Java 接口:概念、实现与最佳实践
  6. 精通 Java 匿名内部类:定义、语法与实战示例
  7. 精通 Java 异常处理:try-catch-finally 与资源管理
  8. Java throw 与 throws 深度解析:异常处理实战指南
  9. 精通 Java Try-With-Resources:自动资源管理详解
  10. Java 注解详解:类型、放置位置与实战示例
  11. Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
  12. 深入理解 Java Vector:用法、特性及与 ArrayList 的对比