規則總結
- 有無異常 `finally` **必執行**(除 `System.exit`/JVM 崩潰)。
- `try`/`catch` 有 `return`,`finally` 仍執行。
- 返回值在 `finally` 前確定:`return expr` 先計算 `expr`,將結果**暫存到局部變量表**,再執行 `finally`,最後從暫存讀取返回。`finally` 中修改變量**不影響**已暫存的返回值。
- `finally` 中**不要放 `return`**,會覆蓋外部返回值,導致邏輯錯誤。
字節碼視角
// 簡化邏輯
int a = 10;
try {
return a; // 1. 計算 a(10) → 暫存槽
} finally {
a = 20; // 2. 修改局部變量 a,暫存槽仍為 10
}
// 3. 從暫存槽載入 10 返回
題主圖解釋
圖中 `a=10`,`try` 中 `return a` 暫存 10,`finally` 改 `a=20`,方法返回 10。驗證了規則 3。