try catch finally,try裏有return,finally還執行麼?(最強總結)

看了部分別人的答案,本身最後仍是想要總結一下。該篇文章是最好的一篇總結,在我認爲。有錯誤的地方,還望之處。轉載請告知link地址。tankyou!!spa


在try語句中,try要把返回的結果放置到不一樣的局部變量當中,執行finaly以後,從中取出返回結果,所以,即便finaly中對變量進行了改變,可是不會影響返回結果,由於使用棧保存返回值,即便在finaly當中進行數值操做,可是影響不到以前保存下來的具體的值,因此return影響不了基本類型的值,這裏使用的棧保存返回值。而若是修改list,map,自定義類等引用類型時,在進入了finaly以前保存了引用的地址, 因此在finaly中引用地址指向的內容改變了,影響了返回值。
對象

總結:
         1.影響返回結果的前提是在 非 finally 語句塊中有 return 且非基本類型
         2.不影響返回結果 的前提是 非 finally 塊中有return 且爲基本類型
究其本質 基本類型在棧中存儲,返回的是真實的值,而引用類型返回的是其淺拷貝堆地址.因此纔會改變。
        return的如果對象,則先把對象的副本保存起來,也就是說保存的是指向對象的地址。若對原來的對象進行修改。對象的地址仍然不變,return的副本仍然是指向這個對象,所用finally中對對象的修改仍然有做用。而基本數據類型保存的是原本來本的數據,return保存副本後,在finally中修改都是修改原來的數據。副本中的數據仍是不變,因此finally中修改對return無影響。



以下圖所示
基本類型:
運行結果:
代碼片斷

int test() {blog

int x = 1;io

try {class

x++;test

returnx;變量

} finally {List

x++;map

}數據類型

}


public staticvoid main(String[] args) {

try {

Test01 test01 =new Test01();

System.out.println(test01.test());;

} catch (Exceptione) {

e.printStackTrace();

}

}

引用類型:
運行結果:
代碼片斷:

publicstatic List<String> test10(){

List<String> strlist =new ArrayList<String>();  

        strlist.add("zs");  

        strlist.add("ls");  

        strlist.add("ww");  

        strlist.add("mz");

        

        try{  

            strlist.add("wq");  

            returnstrlist;  

        } finally {  

            strlist.add("yyy");  

       

}  


public staticvoid main(String[] args) {

try {

Test01 test01 =new Test01();

System.out.println(test01.test10());;

} catch (Exceptione) {

e.printStackTrace();

}

}


以上就是個人總結,若是個人總結對你有幫助,請點個贊。tankyou!!