https://blog.csdn.net/qq_39135287/article/details/78455525

深度解析Finally

一、 首先在大家的印象中,无论程序是否出现异常,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 代码块被执行!");		}	}}

执行结果为: