函數式編程:Lambda 表達式 每博一文案 曾經讀過的依然令我感動的句子,生活總是不如意,但往往是在無數痛苦中,但往往是在無數痛苦中,在重重矛盾 和艱難中才能成熟起來,堅強起來,愛情啊,它使荒蕪變成繁榮,平庸變得偉大,使死去的複活,活著的閃閃發光, 即使愛情是不盡的煎熬折磨,像冰霜般嚴厲,烈火般烤 ...
之前調試只發現有的方法執行完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的在業務上的使用場景其實並不多,此處解釋為了方便源碼調試時的理解