Error和Exception的区别

本文详细解析了Java中try、catch、finally与return语句的执行顺序,通过具体示例说明了finally块如何在return执行前后工作,以及其对返回值的影响。探讨了局部变量与函数返回值的存储方式,解释了finally块中代码执行时机及其对返回值的实际作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,是在return前还是后?
一般答案:会执行,在方法返回调用前执行。准确的说是在return中间执行。

下面举个例子:

public class Test {
public static void main(String[] args) {
System.out.println("结果: " + new Test().test());
}

    static int test(){
        int i = 1;
        try {
            System.out.println("try里面的i : " + i);
            return i;
        }finally{
            System.out.println("进入finally...");
            ++i;
            System.out.println("fianlly里面的i : " + i);
            //return i;
        }
    }

}
结果是:try里面的i : 1
进入finally…
fianlly里面的i : 2
结果: 1
结果是1,并不是大家想象的结2。相关解释如下:

上面我认为比较靠谱的一种解释。

还有一种解释为:

主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。
楼主是从现象级别分析的,我觉得百度知道那个答案说的不够彻底和核心。
从C#(我是C#) 局部变量和函数返回值的存储方式来理解,

他们都存储在堆栈(一种先进后出的结构)上,在上述函数返回的时候,会将返回值压入堆栈栈顶,相当于堆栈中现在有两个相同的值,而finally 使用的是之前的局部变量的值,所以finally操作不会对 返回值产生影响。

说到这里,如果原局部变量是一个引用类型,在try 中叶返回引用,那么堆栈中会有两个引用,但是实际指向同一个对象,这时候在finally正对该局部变量操作会对原对象产生影响。

如果我在finally里最后加上一句return i;那么最后的结果是2,因为上面说用栈保存的值,那这个结果我可不可以理解为:因为栈是先进后出的结构嘛,所以当2压入栈中的时候是在栈顶,所以输出的是栈顶的值也就是2.

最终总结:return语句会先压入栈里面,最后执行finally语句(有return语句,值压入栈中),最后弹出栈顶元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值