新增的3种异常功能

从JDK7开始,增加了3种新的异常功能,从而大大扩充了Java的异常处理机制.第一种新功能支持自动资源管理,当不再需要资源时可以自动释放资源.其基础是一种扩充形式的try,叫做try-with-resources语句.第二种新功能是多重捕获(multi-catch),第三种新功能有时候称为final rethrow或更精确的重新抛出(more precise rethrow)
多重捕获允许同一catch语句捕获两个或更多个异常.如前所述,try语句后面可以跟踪两个或更多个catch语句,实际上经常会这样.虽然每个catch语句经常提供自己特有的代码序列,但是捕获不同异常的两个或更多个catch语句执行相同代码序列的情况并不少见.现在可以使用一个catch语句处理这些异常,而不必单独捕获每种异常类型,这就减少了代码重复.
要创建多重捕获,需要在catch语句中指定异常列表.列表中的每个异常用OR运算符分隔.多重捕获的每个形参隐式的为final(如果愿意,可以显式指定final,但这是没有必要的),所以不能为其赋新值.
下面的语句显示了如何使用多重捕获功能在一个catch语句中同时捕获ArithmeticExcrption和ArrayIndexOutOfBoundsException异常:
}catch(ArithmeticExcrption|ArrayIndexOutOfBoundsException exc) {
下面的程序演示了多重捕获的用法:
     char ch;
     int a[] = new int[10];
     
        try {
            ch = Rethrow.inputChar("input  something");
            System.out.println(a[99]);
        }catch(java.io.IOException|ArrayIndexOutOfBoundsException exc) {
            System.out.println("error");
        }
“更精准的重新抛出”这一功能可被重新抛出的异常的类型限制为相关try块抛出的检查异常(checked exception),前一catch语句没有处理的异常,以及为形参的子类型或超类型的异常.虽然这种功能可能不太常用,但确实可以使用.要想使用final rethrow功能,catch语句的形参必须是final.这意味着在catch块内不能为其赋新值.可以将其显式的指定为final,但是没有必要这么做.