情况一:在try的代码块中没有出现异常时,代码如下
public class Test20190330 {
public static void main(String[] args) {
System.out.println(getInt01());
public static int getInt01(){
int a = 2;
try {
return a;
} catch (Exception e) {
a = 40;
System.out.println(a);
return a;
} finally {
a = 30;
System.out.println(a);
}
}
输出结果为:
由输出结果可以看出catch内的代码块并没有走,而try与finally内都运行了,那为什么结果是try内的结果而不是finally内的呢。是因为在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。
在转去之前,try中先把要返回的结果存放到不同于a的局部变量中去,执行完finally之后,再从中取出返回结果,因此,即使finally中对变量a进行了改变,但是不会影响返回结果。
情况二:当try中的代码块出现异常,且finally中没有return,代码如下:
public class Test20190330 {
public static void main(String[] args) {
System.out.println(getInt02());
}
public static int getInt02(){
int a = 2;
try {
System.out.println(a/0);
return a;
} catch (Exception e) {
a = 4;
return a;
} finally {
a = 30;
}
}
输出结果为:40
finally是在catch中return后面执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;
情况三:在try的代码块中出现异常,且catch与finally中均有return时,代码如下:
public static int getInt03(){
int a = 2;
try {
System.out.println(a/0);
return a;
} catch (Exception e) {
a = 40;
return a;
} finally {
a = 30;
return a;
}
}
输出结果为:30
当catch与finally中都存在return时,最终输出finally内的return值
综上:1,不管有没有出现异常,不管try和catch中有没有return,finally块中代码都会执行;
2,如果finally内没有return:
a,若try内无异常直接返回try内值
吧,若try内有异常,则返回catch内值
3,如果finally中有return语句:那么程序就return了,所以finally中的return是一定会被return的。