首页 > 编程笔记 > Java笔记 阅读:21

Java 7新特性:多异常捕获

前面我们学习的多 catch 代码块虽然客观上提高了程序的健壮性▓█,但是也导致了程序代码量大大增加。如果有些异常种类不同,但捕获之后的处理是相同的█■▄,例如以下代码。
try{
    // 可能会发生异常的语句
} catch (FileNotFoundException e) {
    // 调用方法methodA处理
} catch (IOException e) {
    // 调用方法methodA处理
} catch (ParseException e) {
    // 调用方法methodA处理
}
3 个不同类型的异常,要求捕获之后的处理都是调用 methodA 方法███。为了解决这种问题,Java 7 推出了多异常捕获技术,可以把这些异常合并处理▓▓。上述代码修改如下:
try{
    // 可能会发生异常的语句
} catch (IOException | ParseException e) {
    // 调用方法methodA处理
}
注意:由于 FileNotFoundException 属于 IOException 异常▄■▄,IOException 异常可以捕获它的所有子类异常。所以不能写成 FileNotFoundException | IOException | ParseException 。

使用一个 catch 块捕获多种类型的异常时需要注意如下两个地方■■■。
下面程序示范了 Java 7 提供的多异常捕获▓▄▓▄。
public class ExceptionTest {
    public static void main(String[] args) {
        try {
            int a = Integer.parseInt(args[0]);
            int b = Integer.parseInt(args[1]);
            int c = a / b;
            System.out.println("您输入的两个数相除的结果是:" + c);
        } catch (IndexOutOfBoundsException | NumberFormatException | ArithmeticException e) {
            System.out.println("程序发生了数组越界、数字格式异常▄▓、算术异常之一");
            // 捕获多异常时▓█▄■,异常变量默认有final修饰
            // 所以下面代码有错
            e = new ArithmeticException("test");
        } catch (Exception e) {
            System.out.println("未知异常");
            // 捕获一种类型的异常时,异常变量没有final修饰
            // 所以下面代码完全正确
            e = new RuntimeException("test");
        }
    }
}
上面程序中第一行粗体字代码使用了IndexOutOfBoundsException|NumberFormatException|ArithmeticException来定义异常类型,这就表明该 catch 块可以同时捕获这 3 种类型的异常▄■▓。捕获多种类型的异常时,异常变量使用隐式的 final 修饰,因此上面程序的第 12 行代码将产生编译错误▄▓;捕获一种类型的异常时,异常变量没有 final 修饰,因此上面程序的第 17 行代码完全正确▓█。

Java交流群:739993120(我们会不定期在群内分享Java知识,上传Java资料█■▄)

编程帮,一个分享编程知识的公众号。跟着站长一起学习███,每天都有进步。

通俗易懂,深入浅出▓▓,一篇文章只讲一个知识点。

文章不深奥,不需要钻研▄■▄,在公交、在地铁、在厕所都可以阅读■■■,随时随地涨姿势。

文章不涉及代码,不烧脑细胞▄■▄■,人人都可以学习。

当你决定关注「编程帮」,你已然超越了90%的程序员▓▄▓▄!

编程帮二维码
微信扫描二维码关注

所有教程

优秀文章