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

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

    Java 7之前的版本:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    catch (IOException ex) {
         logger.error(ex);
         throw new MyException(ex.getMessage());
    catch (SQLException ex) {
         logger.error(ex);
         throw new MyException(ex.getMessage());
    }catch (Exception ex) {
         logger.error(ex);
         throw new MyException(ex.getMessage());
    }
    1
    在Java 7中,我们可以用一个catch块捕获所有这些异常:
    1
    2
    3
    4
    catch(IOException | SQLException | Exception ex){
         logger.error(ex);
         throw new MyException(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
    package com.journaldev.util;
     
    public class Java7MultipleExceptions {
     
        public static void main(String[] args) {
            try{
                rethrow("abc");
            }catch(FirstException | SecondException | ThirdException e){
                //以下赋值将会在编译期抛出异常,因为e是final型的
                //e = new Exception();
                System.out.println(e.getMessage());
            }
        }
     
        static void rethrow(String s) throws FirstException, SecondException,
                ThirdException {
            try {
                if (s.equals("First"))
                    throw new FirstException("First");
                else if (s.equals("Second"))
                    throw new SecondException("Second");
                else
                    throw new ThirdException("Third");
            } catch (Exception e) {
                //下面的赋值没有启用重新抛出异常的类型检查功能,这是Java 7的新特性
                // e=new ThirdException();
                throw e;
            }
        }
     
        static class FirstException extends Exception {
     
            public FirstException(String msg) {
                super(msg);
            }
        }
     
        static class SecondException extends Exception {
     
            public SecondException(String msg) {
                super(msg);
            }
        }
     
        static class ThirdException extends Exception {
     
            public ThirdException(String msg) {
                super(msg);
            }
        }
     
    }
    1
     

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

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

  • 相关阅读:
    errorC4430解决办法(vs2013)
    c++获取系统当前时间写入txt文件
    黑苹果安装记录(史上最简单的安装教程——小白福利)
    运行vs生成的exe出现应用程序无法正常启动(0x000007b)解决方案(亲测有效)
    数据可视化工具grafans,忘记密码恢复默认admin(基本使用教程)
    opencv任意形状角度透视变换(代码分析清晰)
    opencv两张规格一样的图片拼接(纵向和横向)
    linux3
    linux2
    linux1
  • 原文地址:https://www.cnblogs.com/GodZhe/p/4946751.html
Copyright © 2011-2022 走看看