JAVA中try-catch-finally中return值问题

结论


return expression;
       如果try/catch中有return语句,执行到该语句时只是先计算expression的值(基本数据类型是确定的值,引用类型是地址)并暂存,然后执行finally代码块中的语句,如果finally中没有return语句,则返回到前面的return语句并返回相应的值,注意如果引用类型的对象在finally被修改,则影响留下;如果finally中有return语句,则会先计算该return语句中的表达式,并返回该值,即原暂存值被覆盖

 


/**
 * @Author: Enoch
 * @Version: V1.0
 * @Time: 2021/8/8 20:59
 */
public class finally_ {

    public static void main(String[] args) {

        System.out.println(m1());
        System.out.println(m2());
        System.out.println(m3());
    }

    static int m1(){
        int x = 1;
        try{
            return x;   // 暂存1作为返回值
        }finally {
            x = 9;  // 改变的是x的值,并未改变暂存的返回值
//            return x;   // 如果取消该return语句的注释,将重新计算return后面的表达式,并将结果作为返回值
        }
    }
    static String m2(){
        String str = "hhhh";
        try{

            return str; // 暂存str的地址,并不返回,而是跳入finally语句块里面
        } finally {
            str = "4543544";    // str指向改变
            return str; // 覆盖掉原暂存的str地址,返回"4543544"所在的地址
        }
    }

    static Re m3(){
        Re re = new Re();
        try{
            return re;  // 暂存re对象的地址,并不返回,而是跳入finally语句块里面
        } finally {
            re.x = 999;
            re.s = "JET BRAIN";
            return re;  // 注释掉该return语句后 效果与注释掉前一样
        }

    }
}

class Re {
    int x = 10;
    String s = "jetBrain";
    char c = 'A';

    @Override
    public String toString() {
        return "Re{" +
                "x=" + x +
                ", s='" + s + '\'' +
                ", c=" + c +
                '}';
    }
}
运行结果:
1
4543544
Re{x=999, s='JET BRAIN', c=A}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值