关于rty,catch,finally中代码的运行顺序的总结

废话不多说,直接上代码:

public class test3 {
    public static void main(String[] args) {
        System.out.println(add());
    }

    public static int add() {
        int i= 0;
        try {
            return i;
        } finally {
            i++;
        }
    }
}

结果为:0
分析一下代码:
1.当代码执行到return i;时,并不是直接将i返回了出去,而是将i保留了起来(因为还有一个finally语句块没有执行!)并且这个保留,就是值传递性质的一个保留,也就是保留的是i的一个副本(复制体),我这里先叫他ii吧.
2.接下来执行finally语句块,finally中将i做了自增运算,i的确变成了1,但是这并没有影响i的复制体ii的值!保留起来的ii的值还是0!
3.这个时候执行完了finally,正式将保留起来的ii返回出去,于是,整个函数的返回结果就是0
4.这个i的副本(复制体)保留的地方是哪儿呢?我查了半天,有个应该靠谱的说法,保留在函数栈中,但具体保留的区域叫什么,我也不知道,还请知情大佬指教一下!

上图或许直观一点:
在这里插入图片描述
那么如果,这个t是一个对象呢?按照前面说的值传递的问题,如果t是一个对象,在finally中对t进行修改,那么最终返回出去的t所显示出来的数据,应该是经过修改的。

写一个Person类来检验一下吧

public class Test {

    public static void main(String[] args) {
        Person result = test();
        System.out.println(result.age);
    }

    public static Person test() {
        Person t = new Person();
        t.age = 0;
        try {
            return t;
        } finally {
            t.age++;
        }
    }

}

class Person {
    int age;
}

这段代码输出的是1,因为Person是一个类,t是一个对象的引用,对象实例保存在堆内存中,t的副本tt也是一个对象的引用,t和tt都指向堆内存中的对象实例,那么不论修改谁,实际上对象实例都被修改了!

如果在finally中也有一个return,会发生什么?

public class test3 {
    public static void main(String[] args) {
        System.out.println(add());
    }

    public static int add() {
        int i= 0;
        try {
            return i;
        } finally {
            i++;
            return i;
        }
    }
}

结果为:1
就是说,如果try中有return而finally中也有return,那么后者将会让前者失效!

理解:try中将t保留了一份副本用于返回出去,到了finally中,又有一个return语句,这时候又要创建一个用于返回的副本,那这个时候就有两个副本了,到底返回谁呢?取后者!

总结:
java规范:finally比return先执行完毕。
也就是说,return先被执行了,执行return的时候发现有finally,于是不能那么快执行完毕return,先去执行finally,等finally执行完毕之后,return才能执行完毕。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值