java面试题:有return的情况下try catch finally的执行结果

问题:

面试官给的代码:

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执行前确定的;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值