finally,return 的执行顺序

Posted 张超五

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了finally,return 的执行顺序相关的知识,希望对你有一定的参考价值。

参考:http://blog.csdn.net/qj19842011/article/details/45675057

关于finally,return的执行顺序
 例子:
  try{
     return expression;
 }finally{
    do some work;
 }
 1、执行:expression,计算该表达式,结果保存在操作数栈顶;
 2、执行:操作数栈顶值(expression的结果)复制到局部变量区作为返回值;
 3、执行:finally语句块中的代码;
 4、执行:将第2步复制到局部变量区的返回值又复制回操作数栈顶;
 5、执行:return指令,返回操作数栈顶的值;
 我们可以看到,在第一步执行完毕后,整个方法的返回值就已经确定了,由于还要执行finally代码块,
 因此程序会将返回值暂存在局部变量区,腾出操作数栈用来执行finally语句块中代码,等finally执行完毕,
 再将暂存的返回值又复制回操作数栈顶。所以无论finally语句块中执行了什么操作,都无法影响返回值,
 所以试图在finally语句块中修改返回值是徒劳的。
 因此,finally语句块设计出来的目的只是为了让方法执行一些重要的收尾工作,而不是用来计算返回值的。

例子验证:

  

public class Test1 {    
    public int exp() {
        try {
            System.out.println("5");
            throw new ArithmeticException();
        } catch (ArithmeticException e) {
            System.out.println("6");
            return 2;
        }finally {
            System.out.println("8");
        }
    }
    public static void main(String[] args) {
        System.out.println(new Test1().exp());
    }
}


执行结果:
5 //先执行了try
6      //执行了catch
8 //执行了finally
2 //最后再执行catch里面的return语句。

 

注意:try,catch,finally代码块里都可能出现return语句,执行情况又是怎么样的呢?

首先,我们要清楚一点:不管在哪个代码块里出现了return,return这个返回动作都是都是要等到finally代码块执行完之后再执行。

所以:1.如果finally代码块里有return语句,那么执行finally里的return,返回结果,不再执行其他代码。

   2.如果finally代码块里没有return语句,try代码块里有return语句,那么执行try里面的return返回结果,不再执行其他代码。

   3.如果finally,try代码块里面都没有return语句那么就执行catch里的return语句.

   4.如果函数不用返回值,那么执行完finally代码块后正常结束。

 

以上是关于finally,return 的执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

java try catch finally return执行顺序

finally和return的执行顺序

其实return和finally的执行顺序问题非常简单,你只有看看代码的指令就清楚咯

其实return和finally的执行顺序问题非常简单,你只有看看代码的指令就清楚咯

try catch finally 中 returne的执行顺序

java_try,catch,finally return之间的执行顺序