在Java中返回值定義為int類型的 方法return 1;中返回的是Integer值,在返回的時候基本類型值1被封裝為Integer類型。
定義一個Test類,在異常處理try中和finally中分別return ;
public class Test { public static void main(String[] args) { System.out.println(new Test().test()); } int test() { try { return func1(); }finally{ return func2(); } } int func1() { System.out.println("func1"); return 1; } int func2() { System.out.println("func2"); return 2; }
運行結果:
嗯,沒問題,最后執行finally改變return的返回值。下面在看一個:
public class Test { public static void main(String[] args) { System.out.println(new Test().test()); } static int test() { int x = 1; try { return x; }finally { ++x; } } }
按照上面的邏輯會返回執行結果為2,但結果並不是這樣:
這里就要講到finally對於return的處理:
在finally塊中處理返回值,當定義為引用類型時,會先返回try中的返回值,然后執行finally會重置返回值,當定義為基本類型時,不會重置try的返回值。
異常代碼加上try語句就標志着運行時會有一個Throwable線程監視該方法的運行,當出現異常時,交由異常邏輯處理,方法在棧內存中運行的,會按照“先進后出”的原則執行,main方法調用異常方法,main方法在下層,異常方法在上層。
當為基本類型時,異常方法執行完畢return x后,此方法的返回值以確定為固定值(基本類型為值拷貝),此后finally代碼塊修改已經沒有意義(類似值傳遞,可以把finally塊看做方法體)當為引用類型時,因為是地址拷貝,所以值會改變。(類似於地址傳遞)
即當定義為int類型時,return x;是值拷貝,所以finally無法修改x的值。
當為return 1;時,因為結果發生個改變,即返回的是finally中的值,即為地址拷貝,返回的是引用類型,即可確定return 1;此時為return new Integer(1);
即return 1;返回的是Integer對象。
關於finally中return的處理;學習與《編寫高質量代碼(改善Java程序的151個建議)》書中 第113條建議----不要在finally塊中處理返回值;筆記見博客:https://blog.csdn.net/sanhewuyang/article/details/84333062
理解不足之處請大家指正。嗯,願我們都被溫柔以待。^_^