1. 程式人生 > 實用技巧 >JAVA++:JAVA中try、catch、finally帶return的執行順序

JAVA++:JAVA中try、catch、finally帶return的執行順序

異常處理中,try、catch、finally的執行順序,大家都知道是按順序執行的。

即,如果try中沒有異常,則順序為try→finally,如果try中有異常,則順序為try→catch→finally。

但是當try、catch、finally中加入return之後,就會有幾種不同的情況出現,下面分別來說明一下。

也可以跳到最後直接看總結。

1):try 中帶有 return

private int testReturn1() {
        int i = 1;
        try {
            i++;
            System.out.println(
"try:" + i); return i; } catch (Exception e) { i++; System.out.println("catch:" + i); } finally { i++; System.out.println("finally:" + i); } return i; }

輸出:

try:2
finally:3
2

因為當try中帶有return時,會先執行return前的程式碼,然後暫時儲存需要return的資訊,再執行finally中的程式碼,最後再通過return返回之前儲存的資訊。

所以,這裡方法返回的值是try中計算後的2,而非finally中計算後的3。但有一點需要注意,

再看另外一個例子:

private List<Integer> testReturn2() {
        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; }

輸出:

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

看完這個例子,可能會發現問題,剛提到return時會臨時儲存需要返回的資訊,不受finally中的影響,為什麼這裡會有變化?

其實問題出在引數型別上,上一個例子用的是基本型別,這裡用的引用型別。

list裡存的不是變數本身,而是變數的地址,所以當finally通過地址改變了變數,還是會影響方法返回值的。

2):catch 中帶有 return

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

輸出:

try:2
catch:3
finally:4
3

catch中return與try中一樣,會先執行return前的程式碼,然後暫時儲存需要return的資訊,再執行finally中的程式碼,最後再通過return返回之前儲存的資訊。

所以,這裡方法返回的值是try、catch中累積計算後的3,而非finally中計算後的4。

3):finally 中帶有 return

private int testReturn4() {
        int i = 1;
        try {
            i++;
            System.out.println("try:" + i);
            return i;
        } catch (Exception e) {
            i++;
            System.out.println("catch:" + i);
            return i;
        } finally {
            i++;
            System.out.println("finally:" + i);
            return i;
        }
    }

輸出:

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失效。

轉:https://www.cnblogs.com/pcheng/p/10968841.html