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


如果try中沒有異常,則順序為try→finally,如果try中有異常,則順序為try→catch→finally,但是當try、catch、finally中加入return之后,就會有幾種不同的情況出現:

一:try中帶有return

  1、基本類型的情況下:

  

 1 public static void main(String[] args) {
 2         int i = testCep1();
 3         System.out.println(i);
 4     }
 5 
 6     private static int testCep1() {
 7         int i = 1;
 8         try {
 9              i++;
10              System.out.println("try:" + i);
11              return i;
12          } catch (Exception e) {
13              i++;
14              System.out.println("catch:" + i);
15          } finally {
16              i++;
17              System.out.println("finally:" + i);
18          }
19          return i;
20      }

 

輸出:

  

 

 

   當try中帶有return時,會先執行return前的代碼,然后暫時保存需要return的信息,再執行finally中的代碼,最后再通過return返回之前保存的信息,因此:try中計算后的2,而非finally中計算后的3

 

  2、引用類型的情況下:

  

public static void main(String[] args) {
        List<Integer> list = testCep2();
        System.out.println(list);
    }

    private static List<Integer> testCep2() {
        List<Integer> list = new ArrayList<>();
        try {
            list.add(1);
            System.out.println("try:" + list);
            return list;
        } catch (Exception e) {
            list.add(2);
            System.out.println("catch:" + list);
        } finally {
            list.add(3);
            System.out.println("finally:" + list);
        }
        return list;
    }

輸出:

  

 

 

   引用類型保存的是變量的地址,所以變量的值在finally中發生改變后,會改變

 

二:catch中帶有return

 1 public static void main(String[] args) {
 2         int i = testCep3();
 3         System.out.println(i);
 4     }
 5 
 6     private static int testCep3() {
 7         int i = 1;
 8         try {
 9             i++;
10             System.out.println("try:" + i);
11             int x = i / 0 ;
12         } catch (Exception e) {
13             i++;
14             System.out.println("catch:" + i);
15             return i;
16         } finally {
17             i++;
18             System.out.println("finally:" + i);
19         }
20         return i;
21     }

輸出:

  

 

 

  catch中return值會覆蓋try中的retrun值, finally中涉及到變量如果是基本類型不影響,如果是引用類型會影響

 

三:finally中帶有return

public static void main(String[] args) {
        int i = testCep4();
        System.out.println(i);
    }

    private static int testCep4() {
        int i = 1;
        try {
            i++;
            System.out.println("try:" + i);
            int x = i / 0 ;
            return i;
        } catch (Exception e) {
            i++;
            System.out.println("catch:" + i);
            return i;
        } finally {
            i++;
            System.out.println("finally:" + i);
            return i;
        }
    }

輸出:

  

 

 

 當finally中有return的時候,try中和catch中的return會失效,在執行完finally的return之后,就不會再執行try中的return,一旦finally里出現異常,會導致catch中的異常被覆蓋


免責聲明!

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



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