Java中的finally与return问题总结

Java中的finally与return问题

我们知道finally中的语句会在try或catch中return语句完成之前执行,但对引用变量与基本变量,执行结果会产生不同。
首先我们先写一下代码:

public class Demo {

    public static void main(String[] args) {
        Person p = testOne();
        int a = testTwo();
        System.out.println("age值为:"+p.age+"    a的值为:"+a);

    }

    public static Person testOne(){
        Person p = new Person();
        try{
            p.age = 18;
            return p;
        }catch (Exception ignored){

        } finally{
            p.age = 10;
        }
    }

    public static int testTwo(){
        int a = 10;
        try{
            return a;
        }catch (Exception e){

        } finally{
             a = 100;
        }
    }
}

class Person{
    int age  = 0;
}

运行结果:

age值为:10    a的值为:10

从上的代码我们可以看出:对于基本变量,finally中的语句似乎没有在return语句完成前完成对变量a的修改,而事实上:
finally中语句完成了对变量a的修改,但是由于return返回的是系统备份a,所以产生了以上的结果。(可以参考return的底层实现原理)
链接: link.
我们分析下内存更好的方便我们理解:
引用类型变量
在代码执行中会在栈内存中创建变量 p 其值为推内存中对象Person的地址值
(假设为0x123),执行到return时会备份p的值,而此时finally中的语句修改推内存中age的值,由于由于return返回系统备份的pd的值,所以返回的还是0x123,但是由于堆内存中age的已经修改所以最后输出的age值为18。
在这里插入图片描述
对于基本变量:
原理同上,但是由于基本变量不会开辟堆内存,所以finally中的语句修改的为栈内存中变量a的值,由于由于return返回系统备份的a的值,所以返回的还是10.在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值