2024.2.7

当有多个嵌套的try…catch…finally时,要特别注意finally的执行时机。当有多层嵌套的finally时,异常在不同的层次抛出 ,在不同的位置抛出,可能会导致不同的finally语句块执行顺序。

package dada;


public class EmbededFinally {

    public static void main(String args[]) {
        int result;
        try {
            System.out.println("in Level 1");
            try {
                System.out.println("in Level 2");
                // result=100/0;  //Level 2
                try {
                    System.out.println("in Level 3");
                    result=100/0;  //Level 3
                }
                catch (Exception e) {
                    System.out.println("Level 3:" + e.getClass().toString());
                }
                finally {
                    System.out.println("In Level 3 finally");
                }
                // result=100/0;  //Level 2
            }
            catch (Exception e) {
                System.out.println("Level 2:" + e.getClass().toString());
            }
            finally {
                System.out.println("In Level 2 finally");
            }
            // result = 100 / 0;  //level 1
        }
        catch (Exception e) {
            System.out.println("Level 1:" + e.getClass().toString());
        }
        finally {
             System.out.println("In Level 1 finally");
        }
    }
}

这段代码演示了嵌套的 try-catch-finally 块以及 finally 块的执行顺序。

代码中的注释标明了三个不同层级的除法运算,它们会抛出异常 ArithmeticException,导致程序中断执行。下面是代码执行过程的解读:

  1. 进入外层的 try 块(Level 1)
  2. 输出 “in Level 1”
  3. 进入内层的 try 块(Level 2)
  4. 输出 “in Level 2”
  5. 进入更深层的 try 块(Level 3)
  6. 输出 “in Level 3”
  7. 执行除法运算 result=100/0,抛出异常
  8. 进入 catch 块,捕获到 ArithmeticException 异常,并输出异常类型
  9. 进入 Level 3 的 finally 块,输出 “In Level 3 finally”
  10. 由于异常被内层的 catch 块处理,程序继续执行
  11. 进行内层 catch 块之后的代码,但此处被注释掉
  12. 进入 Level 2 的 finally 块,输出 “In Level 2 finaly”
  13. 由于异常被内层的 catch 块处理,程序继续执行
  14. 进行外层 catch 块之后的代码,但此处被注释掉
  15. 进入 Level 1 的 finally 块,输出 “In Level 1 finally”

需要注意的是,无论异常是否被捕获,finally 块中的代码都会被执行。它通常用于释放资源或进行清理操作,在异常处理之后执行。在嵌套的 try-catch-finally 块中,内层的 finally 块会在外层的 finally 块之前执行。

 

posted @ 2023-10-18 20:44  kuku睡  阅读(12)  评论(0)    收藏  举报