10.2.3 Java 7提供的多异常捕获机制

10.2.3 Java 7提供的多异常捕获机制

Java 7以前,每个catch块只能捕获一种类型的异常;但Java 7开始,一个catch块可以捕获多种类型的异常
使用一个catch块捕获多种类型的异常时需要注意如下两个地方。

  • 捕获多种类型的异常时,多种异常类型之间用竖线(|)隔开
  • 捕获多种类型的异常时,异常变量有隐式的final修饰,因此程序不能对异常变量重新赋值

示例程序

下面程序示范了Java 7提供的多异常捕获。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class MultiExceptionTest
{
public static void main(String[] args)
{
try
{
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
int c = a / b;
System.out.println("您输入的两个数相除的结果是:" + c );
}
catch (IndexOutOfBoundsException|NumberFormatException
|ArithmeticException ie)
{
System.out.println("程序发生了数组越界、数字格式异常、算术异常之一");
// 捕捉多异常时,异常变量默认有final修饰,
// 所以下面代码有错:
ie = new ArithmeticException("test"); // ①
}
catch (Exception e)
{
System.out.println("未知异常");
// 只捕捉一个类型的异常时,异常变量没有final修饰
// 所以下面代码完全正确。
e = new RuntimeException("test"); // ②
}
}
}

上面程序中使用了IndexOutOfBoundsException|NumberFormatException|ArithmeticException来定义异常类型,这就表明该catch块可以同时捕获这三种类型的异常。

单异常捕获可以对异常变量重新赋值

  • 捕获多种类型的异常时,异常变量使用隐式的final修饰,final修饰的变量初始化后就无法更改,因此上面程序中①号代码将产生编译错误;
  • 捕获一种类型的异常时,异常变量没有final修饰,因此上面程序中②号代码完全正确。

总结

Java 7catch块可以捕获多个异常,捕获多异常时,每个异常以竖杠分隔,多个异常变量隐式使用final修饰,不可以在捕获多异常的catch块中给异常变量重新赋值