try-catch-finally執行順序及多return語句效果
阿新 • • 發佈:2019-02-09
文字內容
1 執行過程
2 return語句
1 執行過程
2 return語句
規則:根據執行過程,最後一個執行的return語句生效,其返回值在執行相應return語句時就被確定,後續修改無效。
public static int testFinally() {
int a = 1;
try {
a = 2;
return a;
} catch (Exception ioe) {
a = 3;
return a;
} finally {
a = 4;
return a;
}
}
// 返回值:4
public static int testFinally() { int a = 1; try { a = 2; return a; } catch (Exception ioe) { a = 3; return a; } finally { a = 4; } } // 返回值:2
原因分析:
在try塊中執行到return a,由於存在finally塊,因此,返回動作暫停,並將此時應返回的值(2)壓入棧;
執行finally塊程式碼,將變數a賦值為4;
執行完finally塊,恢復返回動作,從棧中彈出要返回的資料(2)並返回。
public static int testFinally() { int a = 1; try { a = 2; a = 1/0; // 除數為零異常 return a; } catch (Exception ioe) { a = 3; return a; } finally { a = 4; } } // 返回值:3
原因分析:
同上一例子相同,最後一次執行到的return語句發生在catch塊,當時的返回值為3。
特殊情況:
若返回的內容是引用型別(地址),則在執行最後一次return語句的時候,僅僅是確定了返回的引用值(地址)。
因此,若在finally塊中,修改該引用指向的物件,修改的內容是可以生效的。
若理解基本資料和引用在記憶體中儲存形式的相關知識,就不難理解其中的原因,其最終返回值依然是遵循之前說的規則:
最後一個執行的return語句生效,其返回值在執行相應return語句時就被確定(只是,這裡確定的是引用)。