JavaSE之徹底搞懂try,catch,finally與return的執行

版權聲明:本文爲CSDN博主「狼王神起」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_36262896/article/details/79779953


 在開始我的博客之前,我先引用馬士兵老師的一句話,掌握了內存你就掌握了一切(滑稽)。

         一般情況下,程序執行到try裏面的內容一定會執行finally裏面的內容。如果在try或者catch裏面遇到return,那麼函數在執行完return後面的表達式之後,會先去執行finally裏面的語句塊,然後再結束方法體。但有一種特殊情況,如果在try裏面有System.exit(0)這樣的語句,System.exit(0)是終止Java虛擬機JVM的,連JVM都停止了,所有都結束了,當然finally語句也不會被執行到。現在考慮一般情況下,try,catch,finally與return的執行。

(一) 討論return的執行過程中內存的分配(我個人的見解)
        return相當於一個結束當前方法體的標誌。這有點像跳出循環的break。如果當前方法體是有返回值的,那麼當前方法執行到第一個return時,會在棧空間分配一塊內存,類型爲函數的返回類型,值爲return後面表達式計算出來的值。

        如果執行到第二個return(比如try裏面的return後執行finally裏面的return),那麼在棧空間分配的那塊內存的內容會被替換成新的return後面的表達式的計算值。

        所以當有返回類型的當前方法體結束時,會在棧中留下返回值。不管有沒有將返回值賦給其他變量,這塊空間將會被回收。

(二)討論返回值的類型

1.返回值是基本數據類型。

        在這種情況下,返回的數據不會被return之外的語句影響。

例子:

        

        用內存的觀點其實很好解釋,return i;語句其實是在棧裏新開闢了一塊空間,然後把i的值賦給了新開闢的空間,所以賦值完畢後,i的值怎麼變不影響返回值。

2.返回值是引用數據類型。

        在這種情況下,返回的數據可以被return之外的語句影響。

例子:

    

        用內存的觀點也很好解釋,return i;語句會新開闢一個空間,將i的值賦給新開闢的新開闢的空間。但是i是引用類型,如果對i指向的對象進行操作,那麼也會影響到返回值,因爲他們指向同一塊內存空間。

總結:其實總結起來就兩點

1:函數執行到try裏面的內容,一定會執行finally裏面的語句塊,除非try裏面有類似System.exit()的方法。

2:函數執行到return不一定會直接返回(比如try和catch裏面的),但一定會開闢一塊當前方法體返回類型的空間,裏面的值存的是return後面的表達式計算結果,該結果會被第二個return(finally裏面的)覆蓋。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章