• 第七章《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!

     

  • 相关阅读:
    (六)Spring源码解析:Spring AOP源码解析
    Greenplum 查找数据目录占用最大的表
    【MySQL】数据库备份与容灾详解(实战篇)(MySQL专栏启动)
    第十四章第一节:Java集合框架之ArrayList
    小白excel初步使用2022.06.02
    【leetcode】最少的硬币数目
    2.Flink安装部署\Local本地模式-了解\Standalone独立集群模式\Standalone-HA高可用集群模式(原理|操作|测试)
    ModuleNotFoundError: No module named 'XXX'
    Javaweb之Vue指令的详细解析
    K线学习001-早晨之星1
  • 原文地址:https://blog.csdn.net/shalimu/article/details/128040163