当try和finally都包含return时的执行顺序

Posted littleboys

tags:

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

两段代码演示:

public class Demo4 {
    public static void main(String[] args) {
        System.out.println(new Demo4().test());
    }
    int test(){
        int x=1;
        try {
            return x;
        } finally {
            ++x;
        }
    }
}

 这段代码执行后的结果是:1

 个人理解:当执行try中的语句时,返回值x现在存储的值是1,紧接着执行finally代码块++x,那么现在x的值是2

      那么问题来了:return x的值是否变为2了?答案是否定的,此时return x的值还是1;

      一旦return x的值确定,不管后面怎么操作,都不会影响。

 

 

public class Demo5 {
    public static void main(String[] args) {
        Demo5 d=new Demo5();

        System.out.println(d.get());
    }
    public int get() {
        try {
            return fun1();
        } finally {
            return fun2();
        }
    }
        int fun1(){
            System.out.println("fun1");
            return 1;
        }
        int fun2(){
            System.out.println("fun2");
            return 2;
    }
}

  这段代码执行的结果是:fun1  fun2   2

  个人理解:当main方法调用get方法时会调到try语句块,紧接着回跳到fun1方法中,此时回执行fun1的执行语句 然后返回1到 return fun1();

       try执行过后会执行finally代码块的语句,此时会跳到fun2方法中 执行fun2的输出语句 返回2到return fun2();

       那么最后的结果就是 fun1  fun2  2

 

结论:(1)  try  finally  return 执行顺序是  先执行try  语句块   然后执行 finally语句块   之后执行return

   (2)  当try和finally中都出现return是 (前提不出现异常的情况) 以finally的语句块return为最后的结果

   (3)  当return在try语句块中是 一旦确定了返回值  finally语句块不管怎么操作返回值,结果都是不变的。

      反之当return在finally语句块中 try语句块先对返回值进行操作,那么此时的返回值以操作过后的为准

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

try catch finally 中 returne的执行顺序

try catch finally语句块中存在return语句时的执行情况剖析

有return的情况下try catch finally的执行顺序(转)

[转]有return的情况下try catch finally的执行顺序

try,finally问题

Java中,finally在try语句块中的return前执行还是后执行