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

一、举例说明情况:

例1、try{} -->   catch(){} --> finally{} -->  return;

显然程序按顺序执行。

 1 /**
 2      * 例1、try{} -->   catch(){} --> finally{} -->  return;
 3      */
 4     static Integer f1(){
 5         try {
 6             System.out.println("情况1try");
 7         }catch (Exception e){
 8             System.out.println("情况1catch");
 9         }finally {
10             System.out.println("情况1finally");
11         }
12         return 0;
13     }

例2、try{ return; } --> catch(){}  --> finally{}  --> return;

程序执行try块中return之前(包括return语句中的表达式运算)代码;

再执行finally块,最后执行try中return;

finally块之后的语句return,因为程序在try中已经return所以不再执行。

 1 /**
 2      * try{ return; } --> catch(){}  --> finally{}  --> return;
 3      * @return
 4      */
 5     static Integer f2(){
 6         try {
 7             System.out.println("情况2try");
 8             return 1;
 9         }catch (Exception e){
10             System.out.println("情况2catch");
11         }finally {
12             System.out.println("情况2finally");
13         }
14         return 0;
15     }

例3、try{ } --> catch(){return;}  --> finally{} --> return;

程序先执行try,如果遇到异常执行catch块,

有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,

最后执行catch块中return. finally之后也就是4处的代码不再执行。

无异常:执行完try再finally再return.

 1 /**
 2      * try{ } --> catch(){return;}  --> finally{} --> return;
 3      * @return
 4      */
 5     static Integer f3(){
 6         try {
 7             System.out.println("情况3try");
 8             //int a = 1/0;
 9         }catch (Exception e){
10             System.out.println("情况3catch");
11             return 1;
12         }finally {
13             System.out.println("情况3finally");
14         }
15         return 0;
16     }

无异常:

有异常:

例4、try{ return; } --> catch(){} --> finally{return;}

程序执行try块中return之前(包括return语句中的表达式运算)代码;

再执行finally块,因为finally块中有return所以提前退出。

 1 /**
 2      * try{ return; } --> catch(){} --> finally{return;}
 3      * @return
 4      */
 5     static Integer f4(){
 6         try {
 7             System.out.println("情况4try");
 8             return 1;
 9         }catch (Exception e){
10             System.out.println("情况4catch");
11         }finally {
12             System.out.println("情况4finally");
13             return 2;
14         }
15     }

例5、try{} --> catch(){return;} --> finally{return;}

有异常:程序执行catch块中return之前(包括return语句中的表达式运算)代码;

再执行finally块,因为finally块中有return所以提前退出。

无异常:顺序执行

 1 /**
 2      * try{} --> catch(){return;} --> finally{return;}
 3      * @return
 4      */
 5     static Integer f5(){
 6         try {
 7             System.out.println("情况5try");
 8             //int a = 1/0;
 9         }catch (Exception e){
10             System.out.println("情况5catch");
11             return 1;
12         }finally {
13             System.out.println("情况5finally");
14             return 2;
15         }
16     }

无异常:

有异常:

例6、try{ return;} --> catch(){return;} --> finally{return;}

程序执行try块中return之前(包括return语句中的表达式运算)代码;

有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;

则再执行finally块,因为finally块中有return所以提前退出。

无异常:则再执行finally块,因为finally块中有return所以提前退出。

 1 /**
 2      * try{ return;} --> catch(){return;} --> finally{return;}
 3      * @return
 4      */
 5     static Integer f6(){
 6         try {
 7             System.out.println("情况6try");
 8             //int a = 1 / 0;
 9             return 1;
10         }catch (Exception e){
11             System.out.println("情况6catch");
12             return 2;
13         }finally {
14             System.out.println("情况6finally");
15             return 3;
16         }
17     }

无异常:

有异常:

二、结论

1、不管有没有出现异常,finally块中代码都会执行;

2、当try和catch中有return时,finally仍然会执行;

3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是

之前保存的值),所以函数返回值是在finally执行前确定的;

4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

最终结论:任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。如果finally中有return语句,那么程序就return了,所以finally中

的return是一定会被return的,编译器把finally中的return实现为一个warning。

三、测试用例

  1 package exception;
  2 
  3 /**
  4  * @author zsh
  5  * @company wlgzs
  6  * @create 2019-03-01 10:32
  7  * @Describe 测试用例
  8  * 有return的情况下try catch finally的执行顺序
  9  *
 10  */
 11 public class Main1 {
 12 
 13     /**
 14      * 例1、try{} -->   catch(){} --> finally{} -->  return;
 15      */
 16     static Integer f1(){
 17         try {
 18             System.out.println("情况1try");
 19         }catch (Exception e){
 20             System.out.println("情况1catch");
 21         }finally {
 22             System.out.println("情况1finally");
 23         }
 24         return 0;
 25     }
 26 
 27     /**
 28      * try{ return; } --> catch(){}  --> finally{}  --> return;
 29      * @return
 30      */
 31     static Integer f2(){
 32         try {
 33             System.out.println("情况2try");
 34             return 1;
 35         }catch (Exception e){
 36             System.out.println("情况2catch");
 37         }finally {
 38             System.out.println("情况2finally");
 39         }
 40         return 0;
 41     }
 42 
 43     /**
 44      * try{ } --> catch(){return;}  --> finally{} --> return;
 45      * @return
 46      */
 47     static Integer f3(){
 48         try {
 49             System.out.println("情况3try");
 50             int a = 1/0;
 51         }catch (Exception e){
 52             System.out.println("情况3catch");
 53             return 1;
 54         }finally {
 55             System.out.println("情况3finally");
 56         }
 57         return 0;
 58     }
 59 
 60     /**
 61      * try{ return; } --> catch(){} --> finally{return;}
 62      * @return
 63      */
 64     static Integer f4(){
 65         try {
 66             System.out.println("情况4try");
 67             return 1;
 68         }catch (Exception e){
 69             System.out.println("情况4catch");
 70         }finally {
 71             System.out.println("情况4finally");
 72             return 2;
 73         }
 74     }
 75 
 76     /**
 77      * try{} --> catch(){return;} --> finally{return;}
 78      * @return
 79      */
 80     static Integer f5(){
 81         try {
 82             System.out.println("情况5try");
 83             int a = 1/0;
 84         }catch (Exception e){
 85             System.out.println("情况5catch");
 86             return 1;
 87         }finally {
 88             System.out.println("情况5finally");
 89             return 2;
 90         }
 91     }
 92 
 93     /**
 94      * try{ return;} --> catch(){return;} --> finally{return;}
 95      * @return
 96      */
 97     static Integer f6(){
 98         try {
 99             System.out.println("情况6try");
100             int a = 1 / 0;
101             return 1;
102         }catch (Exception e){
103             System.out.println("情况6catch");
104             return 2;
105         }finally {
106             System.out.println("情况6finally");
107             return 3;
108         }
109     }
110 
111     public static void main(String[] args) {
112         System.out.println("----------------------------");
113         System.out.println(f1());
114         System.out.println("----------------------------");
115         System.out.println(f2());
116         System.out.println("----------------------------");
117         System.out.println(f3());
118         System.out.println("----------------------------");
119         System.out.println(f4());
120         System.out.println("----------------------------");
121         System.out.println(f5());
122         System.out.println("----------------------------");
123         System.out.println(f6());
124         System.out.println("----------------------------");
125     }
126 
127 }
原文地址:https://www.cnblogs.com/zsh-blogs/p/10455165.html