https://blog.csdn.net/qq_39135287/article/details/78455525
一、 首先在大家的印象中,无论程序是否出现异常,Finally代码块是一定会执行的。这个观点可能会让大家有些失望了,答案是否定的。接下来就让我来详细的给大家讲解一下吧。
案例1:
package com.test;public class MyTest {public static void main(String[] args) { System.out.println("main 代码块中的执行结果为:" + myMethod()); }public static int myMethod() {int i = 0;int[] num = { 1, 2, 3 }; System.out.println(num[3]);try { System.out.println("try 代码块被执行!");return 0; } catch (Exception e) { System.out.println("catch 代码块被执行!");return 0; } finally { System.out.println("finally 代码块被执行!"); } }}
其执行结果为:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 at com.test.MyTest.myMethod(MyTest.java:15) at com.test.MyTest.main(MyTest.java:7)
可以看到结果显示 数组下标越界,没有下标为3的这个索引,我们可以看到并没有执行finally代码块中的打印语句
案例2:
package com.test;public class MyTest {public static void main(String[] args) { System.out.println("main 代码块中的执行结果为:" + myMethod()); }public static int myMethod() {int i = 0;int[] num = { 1, 2, 3 };if (i == 0) {return 0; } System.out.println(num[3]);try { System.out.println("try 代码块被执行!");return 0; } catch (Exception e) { System.out.println("catch 代码块被执行!");return 0; } finally { System.out.println("finally 代码块被执行!"); } }}
另外,当我们在myMethod()方法中添加如下这段
if (i == 0) {return 0;}
在运行代码,其结果如下,也没有执行finally代码块中的打印语句
main 代码块中的执行结果为:0
通过以上例子可以看出,finally代码块中的打印语句都没有被执行,这是为什么呢?
这是因为这两个例子都在try代码块之前就结束了myMethod()方法,try代码块并没有得到执行,所以finally中的代码块也不会得到相应的执行。只有在try代码块得到执行的情况下,finally代码块才会得到执行。
二、那么问题又来了,是不是只要try代码块得到执行了,finally代码块才一定会执行呢?可能又会让你们失望了,答案是不一定会执行,这是为什么呢,请看如下的案例3:
package com.test;public class MyTest {public static void main(String[] args) { System.out.println("main 代码块中的执行结果为:" + myMethod()); }public static int myMethod() {try { System.out.println("try 代码块被执行!"); System.exit(0);return 0; } catch (Exception e) { System.out.println("catch 代码块被执行!");return 0; } finally { System.out.println("finally 代码块被执行!"); } }}
执行结果为: