21. 在Java中,如何捕获多个异常?如何使用Java 7引入的多异常捕获特性?
大约 3 分钟
在Java中,可以通过try-catch
结构来捕获异常。在Java 7之前,如果一个try
块可能抛出多种不同类型的异常,需要为每种异常类型编写一个单独的catch
块。Java 7引入了一项新的特性,允许你在一个catch
块中同时捕获多个异常类型,从而简化代码。
捕获多个异常的传统方法(Java 7之前)
在Java 7之前,捕获多个异常需要编写多个catch
块,每个块处理一种特定类型的异常。
public class MultipleExceptionHandling {
public static void main(String[] args) {
try {
// 可能抛出多个异常的代码
int result = 10 / 0;
String text = null;
System.out.println(text.length());
} catch (ArithmeticException e) {
System.out.println("ArithmeticException caught: " + e.getMessage());
} catch (NullPointerException e) {
System.out.println("NullPointerException caught: " + e.getMessage());
}
}
}
使用Java 7引入的多异常捕获特性
Java 7引入了多异常捕获特性,允许在一个catch
块中捕获多个异常类型。多个异常类型用竖线|
分隔。这种方法不仅简化了代码,还避免了重复的异常处理代码。
示例代码
public class MultipleExceptionHandling {
public static void main(String[] args) {
try {
// 可能抛出多个异常的代码
int result = 10 / 0;
String text = null;
System.out.println(text.length());
} catch (ArithmeticException | NullPointerException e) {
System.out.println("Exception caught: " + e.getMessage());
}
}
}
关键点总结
- 多个异常类型在同一个
catch
块中捕获:- 使用
|
符号分隔多个异常类型,可以在一个catch
块中捕获多种不同类型的异常。 - 被捕获的异常类型必须是没有继承关系的,否则编译器会报错。例如,
IOException
和FileNotFoundException
不能放在一起,因为FileNotFoundException
是IOException
的子类。
- 使用
- 捕获的异常对象是
final
类型:- 在多异常捕获中,捕获的异常对象是
final
的,这意味着你不能对这个异常对象重新赋值。 - 这也是为什么不能在多异常捕获块中捕获异常的继承关系,因为编译器需要明确异常对象的类型。
- 在多异常捕获中,捕获的异常对象是
- 简化代码:
- 使用多异常捕获可以显著减少代码中的重复捕获逻辑,增强代码的可读性和可维护性。
示例:带有通用处理的多异常捕获
public class MultipleExceptionHandling {
public static void main(String[] args) {
try {
// 可能抛出多个异常的代码
int result = Integer.parseInt("abc"); // 可能抛出NumberFormatException
String text = null;
System.out.println(text.length()); // 可能抛出NullPointerException
} catch (NumberFormatException | NullPointerException e) {
System.out.println("Exception caught: " + e.getMessage());
// 通用处理逻辑
}
}
}
总结
- 多异常捕获: Java 7引入的多异常捕获特性允许你在一个
catch
块中捕获多个异常类型,简化代码。 - 使用
|
符号: 在catch
块中使用竖线|
分隔多个异常类型。 final
类型: 捕获的异常对象是final
类型,不能重新赋值。
多异常捕获特性使得异常处理更为简洁和灵活,特别是在需要对多个不同类型的异常执行相同处理时。