try catch finally语句块和return的执行先后问题

今天刷牛客的时候碰到一个题,觉得给学java的新人来说很有提醒功能。先放代码。
public class Demo1 {
public static int add(int a,int b) {
try {
return a + b;
} catch (Exception e) {
System.out.println(3);
e.printStackTrace();
}finally {
a=0;
System.out.println(“我是finally啊”);
}
return 0;
}
public static void main(String[]args){
System.out.println(Demo1.add(3,7));
}

}
以上代码不是原题,是我自己手敲的,懒得去找一模一样了。。。。反正都差不多。
求这个输出结果。
对于会的人来说毫无疑问直接就会填,
我是finally啊
10
这个输出结果,对于基础没那么牢固的就会犹豫,到底是10输出在前呢还是我是finally这句话输出在前呢,又或者是输出7外加finally语句呢。
解析如下:
表面上看貌似finally里的语句实在return之后执行的,其实不然,实际上finally里的语句是在return之前执行的。那么问题来了,既然finally在return之前先执行,那么a的值为什么没有被覆盖?
实际过程是这样的:当程序执行到try{}语句中的return方法时,它会干这么一件事,将要返回的结果存储到一个临时栈中,然后程序不会立即返回,而是去执行finally{}中的程序,
在执行a = 2时,程序仅仅是覆盖了a的值,但不会去更新临时栈中的那个要返回的值

。执行完之后,就会通知主程序“finally的程序执行完毕,可以请求返回了”,这时,就会将临时栈中的值取出来返回。这下应该清楚了,要返回的值是保存至临时栈中的。运行结果如下
在这里插入图片描述
那,如果我们将代码改一改呢,
finally {
a=0;
System.out.println(“我是finally啊”);
return a+b;
}
这样就会是输出我是finally啊
7
如下在这里插入图片描述
所以,同样,在执行完finally之后,就会通知主程序请求返回了,即将临时栈的值取出来返回。所以返回值是7;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值