在Java 7中,catch代码块得到了升级,用以在单个catch块中处理多个异常。如果你要捕获多个异常并且它们包含相似的代码,使用这一特性将会减少代码重复度。下面用一个例子来理解。
Java 7之前的版本:
1 | catch (IOException ex) { |
3 | throw new MyException(ex.getMessage()); |
4 | catch (SQLException ex) { |
6 | throw new MyException(ex.getMessage()); |
7 | } catch (Exception ex) { |
9 | throw new MyException(ex.getMessage()); |
1 | 在Java 7 中,我们可以用一个 catch 块捕获所有这些异常: |
1 | catch (IOException | SQLException | Exception ex){ |
3 | throw new MyException(ex.getMessage()); |
如果用一个catch块处理多个异常,可以用管道符(|)将它们分开,在这种情况下异常参数变量(ex)是定义为final的,所以不能被修改。这一特性将生成更少的字节码并减少代码冗余。
另一个升级是编译器对重新抛出异常(rethrown exceptions)的处理。这一特性允许在一个方法声明的throws从句中指定更多特定的异常类型。
让我们来看看一个小例子:
1 | package com.journaldev.util; |
3 | public class Java7MultipleExceptions { |
5 | public static void main(String[] args) { |
8 | } catch (FirstException | SecondException | ThirdException e){ |
11 | System.out.println(e.getMessage()); |
15 | static void rethrow(String s) throws FirstException, SecondException, |
18 | if (s.equals( "First" )) |
19 | throw new FirstException( "First" ); |
20 | else if (s.equals( "Second" )) |
21 | throw new SecondException( "Second" ); |
23 | throw new ThirdException( "Third" ); |
24 | } catch (Exception e) { |
31 | static class FirstException extends Exception { |
33 | public FirstException(String msg) { |
38 | static class SecondException extends Exception { |
40 | public SecondException(String msg) { |
45 | static class ThirdException extends Exception { |
47 | public ThirdException(String msg) { |
如你所见在rethrow方法中,catch块捕获的异常并没有出现在throws从句中。Java 7编译器会分析完整的try代码块以检查从catch块中什么类型的异常被抛出和重新抛出。
需要注意一旦改变了catch块的参数,编译器的分析将不会被启用
原文链接: Journaldev 翻译: ImportNew.com - 吴际
译文链接: http://www.importnew.com/7015.html
[ 转载请保留原文出处、译者、译文链接和上面的微信二维码图片。]