写在前面:
我们在学习异常这一块内容时,老师一把把都会说,为了保证资源的释放,我们加入finally块,因为finally块中的代码一定会执行。但事实?却不然,这篇博客中将带来finally块的执行情况分析与总结。
(1)finally块内容被执行
- finally块的代码是在try代码块的return执行语句执行之后,方法返回之前,执行。说着比较绕口,我们来看一个Demo:
package test5;
public class Test {
public static void main(String[] args) {
int a = test1();
System.out.print(a);
}
private static int test1() {
int b = 20;
try {
return b + 20;
} catch (Exception e) {
} finally {
b += 1;
System.out.println("finally block");
}
return 0;
}
}
控制台输出结果:
finally block
40
我们可以看出,try代码块的return语句执行之后,没有马上返还给调用者。而是记录下返回值,待返回值finally代码执行完毕后,才返回给调用者。所以程序首先执行b+20,并记录,然后执行finally块,打印finally block,最后才将b+20的值返回给调用者。
- finally代码块的return会覆盖try代码块中的return。Demo如下:
package test5;
public class Test {
public static void main(String[] args) {
int a = test1();
System.out.print(a);
}
private static int test1() {
int b = 20;
try {
return b + 20;
} catch (Exception e) {
} finally {
b += 1;
return b;
}
}
}
控制台输出结果:21
这也就印证了,我们刚才所说,finally代码块的return会覆盖try代码块中的return。但,这种方法并不值得我们采用,在Eclipse中,这样写代码,也会报警告,但不会报错。
(2)finally块内容不执行
异常出现在try代码语句块之外
package test5;
public class Test {
public static void main(String[] args) {
test1();
}
private static void test1() {
int[] arr = { 1, 2, 3 };
int number = arr[3];
try {
System.out.print("try");
} catch (Exception e) {
System.out.print("catch");
} finally {
System.out.print("finally");
}
}
}
控制台输出:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at test5.Test.test1(Test.java:11)
at test5.Test.main(Test.java:6)
也就是说异常出现在try代码语句块之外,那么try代码块等都不会执行。
- 如果调用Sytem.exit(0)呢?
package test5;
public class Test {
public static void main(String[] args) {
test1();
}
private static void test1() {
try {
System.out.println("try");
System.exit(0);
} catch (Exception e) {
System.out.println("catch");
} finally {
System.out.println("finally");
}
}
}
由于程序中没有异常,所以调用过Sytem.exit(0)之后,JVM会停止,后面的代码也不会输出。
- 那如果调用Sytem.exit(0)前,try代码块中有异常呢?
package test5;
public class Test {
public static void main(String[] args) {
test1();
}
private static void test1() {
try {
System.out.println("try");
int[] arr = { 1, 2, 3 };
int number = arr[3];
System.exit(0);
} catch (Exception e) {
System.out.println("catch");
} finally {
System.out.println("finally");
}
}
}
try代码块中,出现了索引越界异常,虽然调用了Sytem.exit(0),但后面的代码还是会被执行。