“try”裡面有return語句,“finally”還會執行嗎?

程序員 Java Java虛擬機 技術 我是IT程序猿 我是IT程序猿 2017-10-22

最近發現一個非常有意思的問題,return語句我們一直認為它是方法結束的標誌,它之後的代碼就不再執行了。但是我們又知道,無論“try{}”裡面發生了什麼,“finally{}”都是要執行的。那麼問題來了,如果“try{}”裡面有return語句,“finally{}”還執行嗎?如果會執行,那麼它們之間的先後順序是什麼呢?

如圖:請問,以下程序輸出的值是什麼?2還是3?為什麼?

“try”裡面有return語句,“finally”還會執行嗎?

剛看到這個問題的時候,真是一臉懵逼,突然感覺自己基礎薄弱(有沒有跟我一樣的,請在評論裡說一句,讓我知道,其實我並不孤獨~~)。

經過我實踐發現:輸出其實是2

“try”裡面有return語句,“finally”還會執行嗎?

這樣看上去,似乎我們的“finally{}”語句塊並沒有執行,真的是這樣嗎?讓我們加一條語句輸出i的值驗證一下吧!

“try”裡面有return語句,“finally”還會執行嗎?

啊哦!“finally{}”還是執行了呀!而且是在方法將值返回之前執行的!這就奇怪了,怎麼明明是“finally{}”語句塊裡面先把i的值改為3,然後再將i值返回的,怎麼返回的i值還是2呢?見鬼了麼?

為了搞明白這幾個問題,我不得不去翻閱了Oracle公司的java官方教程的finally語句的描述:

“try”裡面有return語句,“finally”還會執行嗎?

它的大意是說:

當“try{}”語句退出時,“finally{}”語句塊是一定會執行的。但是finally的用處不僅是用來處理異常——它可以讓程序員不會因為return、continue、或者break語句而忽略了清理代碼。把清理代碼放在“finally{}”語句塊裡是一個很好的做法,即便可能不會有異常發生也要這樣做。

好了,從官方說明這裡我們可以知道,即使“try{}”語句中有return語句,“finally{}”會執行也是無疑的!那麼它執行的過程是怎樣的呢?為什麼會發生剛才那樣的結果?

翻看官方的JVM規範我們就知道答案了!

“try”裡面有return語句,“finally”還會執行嗎?

翻譯過來就是:

如果try語句裡有return,那麼代碼的行為如下:

1.如果有返回值,就把返回值保存到局部變量中

2.執行jsr指令跳到finally語句裡執行

3.執行完finally語句後,返回之前保存在局部變量表裡的值

這也就解釋了為什麼返回值是2,而不是“finally{}”中更改後的3了!

OK!問題解決,如有不解之處,可自己實踐一下,便知分曉!

“try”裡面有return語句,“finally”還會執行嗎?

相關推薦

推薦中...