finally究竟什么时候执行

最近这几天再看一些面试题,顺便回忆巩固一下基础知识,其中提到finally块中的code什么时候执行,在return前还是后。

一般技术人员的认知是认为finally在return之前执行;

在查找阅读了相关资料,并通过实际程序运行后,我认为finally块中的code在try块或catch块中的return语句执行之后,返回之前执行。

接下来说一下自己的理由,大家可以共同讨论。

首先看一段代码。

public class Test{
      public static void main(String[] args){
            Test t = new Test();
            int i = t.get();
            System.out.println(i);
    }

    public int get(){
        int flag = 20;
        try{
            System.out.println("try");
            return flag;
        }
        finally{
            ++flag;
            System.out.println("finally");                  
        }
    }
}
//运行结果:try
//        finally
//        20 

从上面的代码实例中可以看出,如果finally语句在return运行前执行完毕,那么最终的flag结果应该是21,但实际结果是20;

可以得到的结论是:try中的return语句调用的函数先于finally中调用的函数执行,即return语句先执行,finally语句后执行,所以,返回的结果是20, 而不是21。

从运行结果中,可以看出,return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。

如果在finally块中加入return语句,则会覆盖掉try中return的返回值。但并不推荐这样写,会给出警告“finally block does not complete normally”。

finally{
            ++flag;
            System.out.println("finally");
            return flag;                    
        }
//运行结果:try
//        finally
//        21

本篇中简单介绍了finally的执行与try块中return语句的关系,如果大家想要得到更多或者跟详细的说明,可以查考一下几篇博客。
1、解释的比较详细,讨论了可能出现的多种情况。
Java finally语句到底是在return之前还是之后执行?
2、对多种情况进行了总结,文章最后的分析可以参考。
有return的情况下try catch finally的执行顺序(最有说服力的总结)

欢迎大家共同讨论!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值