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
,导致程序中断执行。下面是代码执行过程的解读:
- 进入外层的 try 块(Level 1)
- 输出 “in Level 1”
- 进入内层的 try 块(Level 2)
- 输出 “in Level 2”
- 进入更深层的 try 块(Level 3)
- 输出 “in Level 3”
- 执行除法运算
result=100/0
,抛出异常 - 进入 catch 块,捕获到
ArithmeticException
异常,并输出异常类型 - 进入 Level 3 的 finally 块,输出 “In Level 3 finally”
- 由于异常被内层的 catch 块处理,程序继续执行
- 进行内层 catch 块之后的代码,但此处被注释掉
- 进入 Level 2 的 finally 块,输出 “In Level 2 finaly”
- 由于异常被内层的 catch 块处理,程序继续执行
- 进行外层 catch 块之后的代码,但此处被注释掉
- 进入 Level 1 的 finally 块,输出 “In Level 1 finally”
需要注意的是,无论异常是否被捕获,finally 块中的代码都会被执行。它通常用于释放资源或进行清理操作,在异常处理之后执行。在嵌套的 try-catch-finally 块中,内层的 finally 块会在外层的 finally 块之前执行。