最近这几天再看一些面试题,顺便回忆巩固一下基础知识,其中提到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的执行顺序(最有说服力的总结)
欢迎大家共同讨论!