• 第七章《Java的异常处理》第3节:异常的嵌套处理


    上文列举的所有例子中,try-catch-finally的结构都是单层的,没有出现嵌套现象。实际上,try-catch-finally结构也是可以嵌套的,也就是说:一个try-catch-finally组合结构完全可以出现在另一个try块、catch块和finally块中。嵌套书写try-catch-finally的原因很多,例如有时候在处理异常的过程中又会产生新的异常,这时就需要在处理异常的catch块中再次用try-catch结构对异常进行处理。

    在嵌套的try-catch-finally结构中,如果异常出现在内层的try中,那么内层catch会优先捕获到这个异常,而内层catch一旦捕获到这个异常,外层catch就不会重复捕获该异常。如果内层catch无法捕获到这个异常,外层catch才有机会捕获到这个异常。假如每层catch都不能捕获异常,那么虚拟机将会中止程序的运行。下面的【例07_09】很好的展示了内层catch可以优先捕获异常。

    【例07_09 嵌套try-catch】

    Exam07_09.java

    1. import java.util.Scanner;
    2. public class Exam07_09 {
    3.     public static void main(String[] args) {
    4.         int x;
    5.         int[] arr = new int[3];
    6.         Scanner sc = new Scanner(System.in);
    7.         System.out.println("请输入一个整数");
    8.         try {//外层try
    9.             try {//内层try
    10.                 x = sc.nextInt();//①
    11.                 int a = 1/x;//②
    12.                 arr[x] = 2;//③
    13.             }catch(ArithmeticException e) {//内层catch
    14.                 System.out.println("内层catch捕获异常");
    15.             }
    16.         }catch(ArithmeticException | ArrayIndexOutOfBoundsException e) {//外层catch
    17.             System.out.println("外层catch捕获异常");
    18.         }
    19.     }
    20. }

    在【例07_09】中外层try块中又包含了一个try-catch结构。可以看到:内层catch仅能捕获ArithmeticException,外层catch可以捕获ArithmeticException和ArrayIndexOutOfBoundsException两种异常。当用户输入0时,执行语句②会产生算术异常,内层catch可以捕获这个异常,此时外层catch不会重复捕获,因此程序输出结果为“内层catch捕获异常”。当用户输入5时,语句②可以正常执行,但执行语句③产生数组越界异常。由于内层catch无法捕获ArrayIndexOutOfBoundsException导致异常逃脱内层catch,但外层异常会捕获到这个异常,因此程序输出结果为“外层catch捕获异常”。当用户输入的不是一个整数时,执行语句①会产生输入不匹配异常,即InputMismatchException,此时内外两层catch均无法捕获到这个异常,虚拟机会强行中止程序并在控制台上输出异常信息,如图7-10所示。

    图7-10 异常逃脱两层catch

    通过学习7.2和7.3两个小节的内容可以总结出两条结论:

    1. 1.同一个异常不会被多个catch重复捕获
    2. 2.当所有catch都无法捕获异常时,程序会被虚拟机强行中止

    除阅读文章外,各位小伙伴还可以点击这里观看我在本站的视频课程学习Java!

     

  • 相关阅读:
    【无标题】快速控制原型(RCP)丨内置式交流永磁同步电机开发试验系统
    Java多线程之以7种方式让主线程等待子线程结束
    WPF livecharts 折线图遮挡数字问题
    Python Flask 上下文管理源码分析
    Deepstream用户手册——DeepStream应用及配置文件
    使用 cmux smux 对 TCP 进行复用
    SpringBoot日志文件
    使用Navicat Premium进行Oracle数据库schema的复制
    Tealium 分析
    网页编写基础php,apache,wampsever
  • 原文地址:https://blog.csdn.net/shalimu/article/details/128040163