java语言中,在try-catch-finally语句中,我们知道只要程序进入try-catch-finally语句,finally就一定会执行,但是如果try语句或者是catch语句中含有return语句,这时候finally语句还会不会执行呢?或者return和finally语句哪个先执行?
下面请看例子。
例子1:
public class Finally {
public static void main(String[] args){
System.out.println(test());
}
public static int test(){
int b = 1;
try {
System.out.println("try子块");
return b+=10;
} catch (Exception e) {
System.out.println("catch子块");
// TODO: handle exception
} finally {
System.out.println("finally子块");
if(b>3){
System.out.println("b = "+b);
}
}
return b-=5;
}
}
执行结果为:
try子块
finally子块
b = 11
11
由此可知程序先执行了try{}中的return语句,但是并没有立刻返回,跳出test(),而是继续执行finally{}语句,在执行完finally{}语句后,才返回了try中的return值。
你可能已经觉得问题已经很清楚了,但是如果finally语句中也有return语句呢,这时候test()函数返回的到底是try{}中的return值还是finally中的值?看下面的例子。
例子2:
public class Finally {
public static void main(String[] args){
System.out.println(test());
}
public static int test(){
int b = 1;
try {
System.out.println("try子块");
return b+=10;
} catch (Exception e) {
System.out.println("catch子块");
// TODO: handle exception
} finally {
System.out.println("finally子块");
if(b>3){
System.out.println("b = "+b);
}
return b-=5;
}
}
}
执行结果为:
try子块
finally子块
b = 11
6
由此可见,虽然try{}语句中有return 11,但是test()最终返回的并不是该return 值,而是finally中返回的return 6。因此,当finally中有return语句时,该return语句会覆盖掉原来try{}中的语句。
综上所述:当try中有return语句时,会先执行return语句,但不会立刻返回,而是将该return语句的值放在一个临时区。之后,将执行finally语句,finally语句执行完毕后,将返回临时区中的return值;如果finally中也有return 语句,finally中的return值会覆盖掉临时区中的return值,从而返回finally中的return值。