关于java异常try catch finally的一道题

Java异常处理与finally块
本文解析了一段Java代码中try-catch-finally语句的行为,详细解释了在抛出异常后,catch块如何捕获并修改变量,以及finally块执行前如何保存返回值,最终返回的是catch块中赋值的变量而非finally块内的值。

这两天,有人咨询我一道关于java基础的题,具体代码如下:

 1 private static int m1() {
 2     int a = 10;    
 3     try {
 4         a = 20;
 5         throw new RuntimeException();
 6     } catch (Exception e) {
 7         a = 30;
 8         return a;
 9     } finally {
10         a = 40;
11     }
12 }

他问我这个方法的返回结果是多少?finally代码块不是一定会执行的吗?a不是赋值了40?为什么a返回的是30?
我说返回30,具体为什么是30呢?,为了更有说服力,我把上面代码的class进行反编译,得到如下代码:

 1 private static int m1(){
 2     int a = 10;
 3     try {
 4       a = 20;
 5       throw new RuntimeException();
 6     } catch (Exception e){
 7        e = e;
 8        a = 30;
 9        int i = a;
10        a = 40;return i;
11      } finally {
12        localObject = finally;
13        a = 40;
14        throw ((Throwable)localObject);
15      }
16 }

我们看第9和第10两行代码,心里是否已经有了答案?之所以结果是30是因为return返回的是i,而i是由a赋值30后赋值给的i。

总结:首先a初始化赋值为10,接着a重新赋值为了20,然后throw抛出异常catch被执行,所以a再次被赋值为30,接着把a赋值给i,所以i为30。当return的时候本来应该是直接返回i的,但是程序还要执行finally代码块,所以程序把i先放到暂存。最后虽然a被赋值为了40,但是程序返回的是i(30)。

转载于:https://www.cnblogs.com/hxit/p/10172579.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值