之前除錯只發現有的方法執行完return陳述句后再執行finally,但是沒有細究
最近debug代碼的時候發現,不同回傳型別的方法,return和finally執行順序竟然不一樣
先看回傳型別為void的執行順序:

繼續執行:

繼續:

發現執行順序是:
try中代碼->finally代碼->try中的return,是先執行finally,再執行return
再看回傳型別為int型別的執行順序:

繼續執行:

發現竟然直接到了return,繼續:

開始執行finally,執行順序為:
try中代碼->try中return->finally,而且此方法回傳值依然為1,x=100會執行,但不會回傳
原因:
void方法的return就是回傳,return是方法的最后一步,當然先執行finally
int方法或其他有回傳值的方法,return實際是將回傳值賦值給一個匿名變數,并在最后回傳前加載該變數到堆疊頂,然后執行回傳,所以debug執行testx時,執行return x并不是直接回傳,只是把x的值賦給了一個匿名變數
補充:
JDK 7之后提供了try with resource的方式,會在代碼塊執行完畢后執行Closeable的close方法,釋放資源
所以finally的在業務上的使用場景其實并不多,此處解釋為了方便原始碼除錯時的理解
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/545911.html
標籤:其他
上一篇:函式式編程:Lambda 運算式
