finally在处理异常中的小细节

        try-catch-finally是用来捕获异常的,其中finally不管是try或者是catch中有没有异常,最后大概率都是会执行的,这是因为编译器会将finally块中的代码复制成两份,分别添加在try和catch的后面,但是如果try或者catch中出现了return语句,情况就会不一样。下面我们就来看一下这种情况。

1、finally中没有return语句

  int i = 1;
try {
  i = 2;
  return i;
} catch (Exception e) {

} finally {
  i = 3;
}

最后的返回值是2

2、finally中有return语句

  int i=1;
try {
  i = 2;
  return i;
} catch (Exception e) {

} finally {
  i = 3;
  return i;
}

最后的返回值是3

        上面两个代码只是在finally中是否存在return语句的区别,但是结果却是不一样的。        

        可以看到如果finally中没有return语句,程序就会把finally中的操作数据忽略掉,其实finally中的数据操作是执行的,但是并没有返回,所以给我们的感觉是像没有操作一样。return语句返回之前,虚拟机会将待返回的值压入操作数栈,等待返回,即使finally语句对i进行了修改,但是待返回的值已经确实存在于操作数栈中,所以不会影响程序返回结果。在try中的数据处理完,如果检测到有try中有return语句时,会先将数据压入操作数栈等待返回,然后去执行finally语句,如果finally语句没有将新的结果压入操作数栈中,那么只能返回原先的结果2。

        从这个角度理解,即使finally中对数据处理,但是返回的依旧是try中的“脏数据”(过时的数据)

        也就是说finally并不是没有执行,而是执行了却没有返回。如果在finally中添加return语句会将finally处理过的数据压入操作数栈返回,原先的“脏数据”失效。所以返回的是3

        注意:这里指的是基本变量,如果是引用类型不受此影响。因为不管在哪里进行运算,处理的都是引用背后的“实体”。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值