在Java 7中,捕获区块已改进,以处理单一捕获区块中的多个例外. 如果你捕获多个例外,并且它们有类似的代码,那么使用此功能将减少代码重复。
Java 捕捉多个例外
Before Java 7, we used to catch multiple exceptions one by one as shown below.
1catch (IOException ex) {
2 logger.error(ex);
3 throw new MyException(ex.getMessage());
4catch (SQLException ex) {
5 logger.error(ex);
6 throw new MyException(ex.getMessage());
7}
在Java 7中,我们可以在一个捕捉区块中捕捉到这两个例外,如下:
1catch(IOException | SQLException ex){
2 logger.error(ex);
3 throw new MyException(ex.getMessage());
4}
如果一个 catch 块处理多个例外,则可以使用管道分离它们,在这种情况下,例外参数(ex)是最终的,所以您不能更改它。
Java Rethrow 例外
另一个改进是编译器对重叠例外的分析。Java重叠例外允许您在方法声明的投放条款中指定更具体的例外类型。
1package com.journaldev.util;
2
3public class Java7MultipleExceptions {
4
5 public static void main(String[] args) {
6 try{
7 rethrow("abc");
8 }catch(FirstException | SecondException | ThirdException e){
9 //below assignment will throw compile time exception since e is final
10 //e = new Exception();
11 System.out.println(e.getMessage());
12 }
13 }
14
15 static void rethrow(String s) throws FirstException, SecondException,
16 ThirdException {
17 try {
18 if (s.equals("First"))
19 throw new FirstException("First");
20 else if (s.equals("Second"))
21 throw new SecondException("Second");
22 else
23 throw new ThirdException("Third");
24 } catch (Exception e) {
25 //below assignment disables the improved rethrow exception type checking feature of Java 7
26 // e=new ThirdException();
27 throw e;
28 }
29 }
30
31 static class FirstException extends Exception {
32
33 public FirstException(String msg) {
34 super(msg);
35 }
36 }
37
38 static class SecondException extends Exception {
39
40 public SecondException(String msg) {
41 super(msg);
42 }
43 }
44
45 static class ThirdException extends Exception {
46
47 public ThirdException(String msg) {
48 super(msg);
49 }
50 }
51
52}
正如你所看到的,在‘rethrow’ 方法中, catch block 抓取例外,但它不是投放条款的一部分。Java 7 编译器分析了完整的试用区块,以检查哪些类型的例外被扔掉,然后从 catch block 重新抓取。