标签:
在Java 7中,catch代码块得到了升级,用以在单个catch块中处理多个异常。如果你要捕获多个异常并且它们包含相似的代码,使用这一特性将会减少代码重复度。下面用一个例子来理解。
Java 7之前的版本:
| 1 2 3 4 5 6 7 8 9 10 | catch(IOException ex) {     logger.error(ex);     thrownewMyException(ex.getMessage());catch(SQLException ex) {     logger.error(ex);     thrownewMyException(ex.getMessage());}catch(Exception ex) {     logger.error(ex);     thrownewMyException(ex.getMessage());} | 
| 1 | 在Java 7中,我们可以用一个catch块捕获所有这些异常: | 
| 1 2 3 4 | catch(IOException | SQLException | Exception ex){     logger.error(ex);     thrownewMyException(ex.getMessage());} | 
| 1 |  | 
如果用一个catch块处理多个异常,可以用管道符(|)将它们分开,在这种情况下异常参数变量(ex)是定义为final的,所以不能被修改。这一特性将生成更少的字节码并减少代码冗余。
另一个升级是编译器对重新抛出异常(rethrown exceptions)的处理。这一特性允许在一个方法声明的throws从句中指定更多特定的异常类型。
让我们来看看一个小例子:
| 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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | packagecom.journaldev.util;publicclassJava7MultipleExceptions {    publicstaticvoidmain(String[] args) {        try{            rethrow("abc");        }catch(FirstException | SecondException | ThirdException e){            //以下赋值将会在编译期抛出异常,因为e是final型的            //e = new Exception();            System.out.println(e.getMessage());        }    }    staticvoidrethrow(String s) throwsFirstException, SecondException,            ThirdException {        try{            if(s.equals("First"))                thrownewFirstException("First");            elseif(s.equals("Second"))                thrownewSecondException("Second");            else                thrownewThirdException("Third");        } catch(Exception e) {            //下面的赋值没有启用重新抛出异常的类型检查功能,这是Java 7的新特性            // e=new ThirdException();            throwe;        }    }    staticclassFirstException extendsException {        publicFirstException(String msg) {            super(msg);        }    }    staticclassSecondException extendsException {        publicSecondException(String msg) {            super(msg);        }    }    staticclassThirdException extendsException {        publicThirdException(String msg) {            super(msg);        }    }} | 
| 1 |  | 
如你所见在rethrow方法中,catch块捕获的异常并没有出现在throws从句中。Java 7编译器会分析完整的try代码块以检查从catch块中什么类型的异常被抛出和重新抛出。
需要注意一旦改变了catch块的参数,编译器的分析将不会被启用。
JAVA 7新特性——在单个catch代码块中捕获多个异常,以及用升级版的类型检查重新抛出异常
标签:
原文地址:http://www.cnblogs.com/GodZhe/p/4946751.html