java异常处理中的返回值

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.try-catch中的返回值

java代码中,有各种各样的try-catch代码用来捕获各种异常。那么在try-catch代码中,返回值是如何处理的呢?先看看下面的代码

    public static int test_finally() {
        int x;
        try {
            x = 1;
            //int y = 1/0; 注释1
            //String raw = "a"; 注释2
            //raw.substring(3); 注释2
            return x;
        } catch(ArithmeticException ex) {
            x = 2;
            return x;
        } finally {
            x = 3;
        }
    }

2.执行结果

1.如果代码正常执行,返回结果为1。
2.如果加入注释1的代码,返回结果为2。
3.如果加入注释2的代码,直接抛出异常无返回结果。

3.结果分析

第一种情况很好理解,代码走正常逻辑直接返回结果。
第三种情况也比较好理解,直接抛异常。
第二种情况有的同学可能会问,明明finally中给x=3,为什么会返回2?

对于一个java方法来说,退出的方式有两种:

  1. 遇到一个返回的指令(return语句)
  2. 遇到一个异常,并且没有搜索到异常处理器,不会给调用返回任何值。
    所以当catch中有return时,程序遇到return时就被标记了,finally块中只是执行最后的清理工作,如数据库连接的释放等。但是并不会修改return这个语句。
    如果我们把代码放在intellij里面,x = 3这一行会提示:
    The value 3 assigned to 'x' is never used less

如果我们在intellij里面debug,当代码运行到x = 3这一行时,堆栈信息如下:

这里写图片描述

当程序执行到catch代码快中的return x 那一行时,首先是将x的一个副本保存在了方法栈帧的本地变量表中,执行return之前必须执行finally中的操作:x=3,此时将x设置为了3。但是return时是将本地变量表中保存的x的那个副本拿出来放到栈顶返回,所以出ArithmeticException异常或其子类异常时,返回值是2。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值