本篇文章咱們主要探討 一下若是try {}
語句中有return
,這種狀況下finally
語句還會執行嗎?其實JVM規範是對這種狀況有特殊規定的,那我就先上代碼吧!html
public class FinallyTest { public int method() { int x = 1; try{ ++ x; return x; }catch(Exception e){ }finally{ ++ x; } return x; } public static void main(String[] args) { FinallyTest t = new FinallyTest(); int y = t.method(); System.out.println(y); } }
對於上述代碼,咱們有如下幾個問題,來自測一下吧:java
若是在 try 語句塊裏使用 return 語句,那麼 finally 語句塊還會執行嗎?程序員
若是執行,那麼是怎樣實現既執行 return 又執行 finally 的呢?oracle
上面的程序輸出是什麼?爲何?jvm
對於該問題,答案是確定的。Java官方文檔上是這麼描述的:debug
The
finally
block always executes when thetry
block exits.`code
咱們看到描述詞用的是always,即在try執行完成以後,finally是必定會執行的。這種特性可讓程序員避免在try
語句中使用了return
, continue
或者 break
關鍵字而忽略了關閉相關資源的操做。把清理相關資源放到finally
語句塊中一直是最佳實踐。htm
PS: 用到finally關閉資源的時候,給你們提個醒,應該儘可能避免在finally
語句塊中出現運行時錯誤,能夠適當添加判斷語句以增長程序健壯性:blog
finally { if (out != null) { System.out.println("Closing PrintWriter"); out.close(); // 不要在finally語句中直接調用close() } else { System.out.println("PrintWriter not open"); } }
咱們知道了finally語句會執行,當咱們在IDE上運行該程序的時候,會發現運行結果是2。那麼爲何不是3呢?資源
咱們來debug一下:
咱們在下圖能夠看到,try中x值是2,且執行了try語句塊中的return x
語句。
以後執行了finally語句,x取值3,而且成功執行finally塊中return x
。
try中返回了x=2
, finally語句中返回了x=3
,並且finally語句更靠後被return,爲何結果是2呢?
原來JVM規範裏面明確說明了這種狀況:
If the try clause executes a return, the compiled code does the following: 1. Saves the return value (if any) in a local variable. 2. Executes a jsr to the code for the finally clause. 3. Upon return from the finally clause, returns the value saved in the local variable.
大意就是若是在try中return的狀況下,先把try中將要return的值先存到一個本地變量中,即本例中的x=2將會被保存下來。接下來去執行finally語句,最後返回的是存在本地變量中的值,即返回x=2.
Notes:還有一點要注意的,若是你在finally裏也用了return語句,好比return ++x。那麼程序返回值會是3。由於規範規定了,當try和finally裏都有return時,會忽略try的return,而使用finally的return。
今天主要介紹了當try語句中有return的時候,其與finally語句的執行狀況。咱們的獲得的結論有:
本文由博客一文多發平臺 OpenWrite 發佈!
我的公衆號:技術Go
您的點贊與支持是做者持續更新的最大動力!