finally中return問題分析 && Java中返回值定義為int類型的 方法return 1返回的是int還是Integer


 

 

在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

理解不足之處請大家指正。嗯,願我們都被溫柔以待。^_^

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM