首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java finally 與 return 執行順序深度解析:五大場景圖解

     編輯:Java 相關知識

核心結論

finally 塊在 try/catch 的 return 執行之後、返回值確定之後、實際返回給調用者之前執行。

五大經典場景實測

1. try 有 return,finally 無 return、不修改返回值

public static int test1() {
    int b = 20;
    try { return b += 80; } // 返回值 100 已確定
    finally { System.out.println("finally"); }
}

輸出:`try block → finally block → 100`。finally 在 return 後執行,但不影響返回值。

2. finally 有 return → 覆蓋 try/catch 返回值

public static int test2() {
    try { return 100; }
    finally { return 200; } // 直接返回 200
}

輸出:`200`。finally return 會導致外層 return 成為不可達代碼(編譯錯誤需註釋)。

3. finally 修改變數但無 return → 不影響已確定的返回值

public static int test3() {
    int b = 20;
    try { return b += 80; } // 返回值 100 脫離 b
    finally { b = 150; } // 修改 b 無效
}

輸出:`100`。返回值在 try return 時已壓棧,finally 修改局部變數不影響。

4. try 拋異常,catch 有 return,finally 無 return

public static int test4() {
    int b = 20;
    try { b = b/0; return b; } // 不執行
    catch { b += 15; return b; } // 返回值 35 確定
    finally { b += 50; } // 不影響 35
}

輸出:`35`。catch return 同理,返回值確定後 finally 執行不影響。

5. catch 有 return,finally 有 return → finally 覆蓋

public static int test5() {
    try { throw new Exception(); }
    catch { return 100; }
    finally { return 200; }
}

輸出:`200`。

特殊情況:finally 不執行

  1. try 尚未進入(如 try 前直接 return)
  2. try/catch 中呼叫 `System.exit(0)` 終止 JVM

總結表

場景返回值來源finally 能否修改返回值
try return 正常try return 值不能(值已壓棧)
catch returncatch return 值不能
finally 有 returnfinally return 值直接覆蓋
異常未捕獲無(拋出)仍執行

結語

理解「返回值確定 → finally 執行 → 實際返回」的順序,是寫正確資源釋放代碼(如關閉流、釋放鎖)的關鍵。

出處:bianceng.cn

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved