JAVA 7新特性——在单个catch代码块中捕获多个异常,以及用升级版的类型检查重新抛出异常

在Java 7中,catch代码块得到了升级,用以在单个catch块中处理多个异常。如果你要捕获多个异常并且它们包含相似的代码,使用这一特性将会减少代码重复度。下面用一个例子来理解。

Java 7之前的版本:

1 catch (IOException ex) {
2      logger.error(ex);
3      throw new MyException(ex.getMessage());
4 catch (SQLException ex) {
5      logger.error(ex);
6      throw new MyException(ex.getMessage());
7 }catch (Exception ex) {
8      logger.error(ex);
9      throw new MyException(ex.getMessage());
10 }
1 在Java 7中,我们可以用一个catch块捕获所有这些异常:
1 catch(IOException | SQLException | Exception ex){
2      logger.error(ex);
3      throw new MyException(ex.getMessage());
4 }
1  

如果用一个catch块处理多个异常,可以用管道符(|)将它们分开,在这种情况下异常参数变量(ex)是定义为final的,所以不能被修改。这一特性将生成更少的字节码并减少代码冗余。

另一个升级是编译器对重新抛出异常(rethrown exceptions)的处理。这一特性允许在一个方法声明的throws从句中指定更多特定的异常类型。

让我们来看看一个小例子:

1 package com.journaldev.util;
2  
3 public class Java7MultipleExceptions {
4  
5     public static void main(String[] args) {
6         try{
7             rethrow("abc");
8         }catch(FirstException | SecondException | ThirdException e){
9             //以下赋值将会在编译期抛出异常,因为e是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             //下面的赋值没有启用重新抛出异常的类型检查功能,这是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 }
1  

如你所见在rethrow方法中,catch块捕获的异常并没有出现在throws从句中。Java 7编译器会分析完整的try代码块以检查从catch块中什么类型的异常被抛出和重新抛出。

需要注意一旦改变了catch块的参数,编译器的分析将不会被启用

原文链接: Journaldev 翻译: ImportNew.com 吴际
译文链接: http://www.importnew.com/7015.html
转载请保留原文出处、译者、译文链接和上面的微信二维码图片。]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值