问题:
面试官给的代码:
try{
user.setName(“cs”);
return user.getName();
}finally{
user.setName(“css”);
}
这段代码执行后,return的值是什么?user的Name最终值为?
答:return的值是"cs"
user的Name最终值是"css"
解答:
参考:有return的情况下try catch finally的执行顺序(最有说服力的总结)
虽然博主说明了在该情况下执行顺序为:
情况2:try{ return; }catch(){} finally{} return;
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,最后执行try中return;
finally块之后的语句return,因为程序在try中已经return所以不再执行。
但是由于面试官给的代码里return值并非常量,所以写了代码验证了一下
public class HelloWorld {
public static class a{
private int aa=10;
public void setAa(int aa) {
this.aa = aa;
}
public int getAa() {
return aa;
}
}
public static a a = new a();
public static int test(){
try{
a.setAa(20);
return a.getAa();
}finally {
a.setAa(30);
}
}
public static void main(String[] args) {
System.out.println(test());
System.out.println(a.getAa());
}
}
/*执行结果:
20
30
*/
所以结合博主给的结论
1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。 在转去之前,try中先把要返回的结果存放到不同于x的局部变量中去,执行完finally之后,在从中取出返回结果, 因此,即使finally中对变量x进行了改变,但是不会影响返回结果。 它应该使用栈保存返回值。
所有可以得到结论:
finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;