JAVA中try、catch、finally帶return的執行順序總結


  異常處理中,try、catch、finally的執行順序,大家都知道是按順序執行的。即,如果try中沒有異常,則順序為try→finally,如果try中有異常,則順序為try→catch→finally。但是當try、catch、finally中加入return之后,就會有幾種不同的情況出現,下面分別來說明一下。也可以跳到最后直接看總結。

 

一、try中帶有return

 1     private int testReturn1() {
 2         int i = 1;
 3         try {
 4             i++;
 5             System.out.println("try:" + i);
 6             return i;
 7         } catch (Exception e) {
 8             i++;
 9             System.out.println("catch:" + i);
10         } finally {
11             i++;
12             System.out.println("finally:" + i);
13         }
14         return i;
15     }

輸出:

try:2
finally:3
2

  因為當try中帶有return時,會先執行return前的代碼,然后暫時保存需要return的信息,再執行finally中的代碼,最后再通過return返回之前保存的信息。所以,這里方法返回的值是try中計算后的2,而非finally中計算后的3。但有一點需要注意,再看另外一個例子:

 1     private List<Integer> testReturn2() {
 2         List<Integer> list = new ArrayList<>();
 3         try {
 4             list.add(1);
 5             System.out.println("try:" + list);
 6             return list;
 7         } catch (Exception e) {
 8             list.add(2);
 9             System.out.println("catch:" + list);
10         } finally {
11             list.add(3);
12             System.out.println("finally:" + list);
13         }
14         return list;
15     }

輸出:

try:[1]
finally:[1, 3]
[1, 3]

  看完這個例子,可能會發現問題,剛提到return時會臨時保存需要返回的信息,不受finally中的影響,為什么這里會有變化?其實問題出在參數類型上,上一個例子用的是基本類型,這里用的引用類型。list里存的不是變量本身,而是變量的地址,所以當finally通過地址改變了變量,還是會影響方法返回值的。

 

二、catch中帶有return

 1     private int testReturn3() {
 2         int i = 1;
 3         try {
 4             i++;
 5             System.out.println("try:" + i);
 6             int x = i / 0 ;
 7         } catch (Exception e) {
 8             i++;
 9             System.out.println("catch:" + i);
10             return i;
11         } finally {
12             i++;
13             System.out.println("finally:" + i);
14         }
15         return i;
16     }

輸出:

try:2
catch:3
finally:4
3

  catch中return與try中一樣,會先執行return前的代碼,然后暫時保存需要return的信息,再執行finally中的代碼,最后再通過return返回之前保存的信息。所以,這里方法返回的值是try、catch中累積計算后的3,而非finally中計算后的4。

 

三、finally中帶有return

 1     private int testReturn4() {
 2         int i = 1;
 3         try {
 4             i++;
 5             System.out.println("try:" + i);
 6             return i;
 7         } catch (Exception e) {
 8             i++;
 9             System.out.println("catch:" + i);
10             return i;
11         } finally {
12             i++;
13             System.out.println("finally:" + i);
14             return i;
15         }
16     }

輸出:

try:2
finally:3
3

  當finally中有return的時候,try中的return會失效,在執行完finally的return之后,就不會再執行try中的return。這種寫法,編譯是可以編譯通過的,但是編譯器會給予警告,所以不推薦在finally中寫return,這會破壞程序的完整性,而且一旦finally里出現異常,會導致catch中的異常被覆蓋。

 

總結:

1、finally中的代碼總會被執行。

2、當try、catch中有return時,也會執行finally。return的時候,要注意返回值的類型,是否受到finally中代碼的影響。

3、finally中有return時,會直接在finally中退出,導致try、catch中的return失效。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM