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


2种场景

(1) try中有return,finally中没有return(注意会改变返回值的情形);
(2) try中有return,finally中有return;

场景代码分析(idea亲测)

场景一:

 1 //实例一:try中有return,finally中没有return
 2 public class TryReturnFinally {
 3     public static void main(String[] args) {
 4         System.out.println(test());
 5     }
 6     private static int test(){
 7         int num = 10;
 8         try{
 9             System.out.println("try");
10             return num += 80;
11         }catch(Exception e){
12             System.out.println("error");
13         }finally{
14             if (num > 20){
15                 System.out.println("num>20 : " + num);
16             }
17             System.out.println("finally");
18         }
19         return num;
20     }
21 }

run:

try
num>20 : 90
finally
90

实例二:

 1 //实例二:try中有return,finally中没有return,但是会改变返回值的情况
 2 public class TryReturnFinally {
 3     public static void main(String[] args) {
 4         System.out.println(test());
 5     }
 6     private static int test(){
 7         int num = 10;
 8         try{
 9             System.out.println("try");
10             return num;
11         }catch(Exception e){
12             System.out.println("error");
13         }finally{
14             if (num > 20){
15                 System.out.println("num>20 : " + num);
16             }
17             System.out.println("finally");
18             num = 100;
19         }
20         return num;
21     }
22 }

run:

try
finally
10

过程剖析:当程序执行到try语句块中的return方法时,将要返回的结果存储到一个临时栈中,然后程序不会立即返回,而是去执行finally语句块中的程序, 在执行"num = 100"时,程序仅仅是覆盖了num的值,但不会去更新临时栈中的那个要返回的值 。执行完之后,就会通知主程序“finally的程序执行完毕,可以请求返回了”,这时,就会将临时栈中的值取出来返回。

场景二:

 1 //try中有return,finally中有return
 2 public class TryReturnFinally {
 3     public static void main(String[] args) {
 4         System.out.println(test());
 5     }
 6     private static int test(){
 7         int num = 10;
 8         try{
 9             System.out.println("try");
10             return num += 80;
11         }catch(Exception e){
12             System.out.println("error");
13         }finally{
14             if (num > 20){
15                 System.out.println("num>20 : " + num);
16             }
17             System.out.println("finally");
18             num = 100;
19             return num;
20         }
21     }
22 }

run:

1 try
2 num>20 : 90
3 finally
4 100

总结:

流程是先运行try内部代码,判断finally中是否有return,
如果有,那么就不执行try中的return,继续执行finally中的代码
如果没有,那么先执行finally中代码,再执行try的return。

参考:

https://blog.csdn.net/yingshuanglu2564/article/details/82593916

https://www.jianshu.com/p/75a93408b5f8