天天看点

finally与return执行循序 Java

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值。