如果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中的異常被覆蓋