一、执行顺序
仅仅在下面4种情况下不会执行finally语句:
- 若在try或catch语句中执行了System.exit(0)
- 在执行finally之前jvm崩溃了
- try语句中执行了死循环
- 电源断电
除以上情况,finally语句都会执行。
二、执行原则
- 不管有没有出现异常,finally中代码都会执行。若无异常,顺序为:try-finally
- 当try和catch中有return语句时,finally语句仍会执行
注意:当finally里没有return语句时,执行try和finally语句之后,最后在执行return
public static int demo2() {
try {
return 0;
}
finally {
System.out.println("finally trumps return.");
}
}
//输出结果
finally trumps return.
0
- finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
public static int demo3()
{
int i = 0;
try {
i = 2;
return i;
} finally {
i = 12;
System.out.println("finally trumps return.");
}
}
//输出结果
finally trumps return.
2
此处中finally中对i赋值12但是demo3的返回值仍然是2,也就是在finally中对i赋值并未改变i的返回值
- finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
public static int demo4() {
int i = 0;
try {
return i;
} finally {
i = 12;
System.out.println("finally trumps return.");
return i;
}
}
//输出结果
finally trumps return.
12
上面为什么会返回12呢?因为在程序还未执行try中的return语句时就先执行了finally里面的return语句
三、常见笔试题
1、输出结果是?
public static int demo5() {
try {
return printX();
}
finally {
System.out.println("finally trumps return... sort of");
}
}
public static int printX() {
System.out.println("X");
return 0;
}
//输出结果
X
finally trumps return... sort of
0
原因如下:程序顺序执行时先执行printX()函数,此时得到返回值0并且将0保存到variable中对应的用于保存返回值的区域,此时程序在执行finally语句因为finally语句中没有return语句,所以程序将返回值区域的0返回给上一级函数。