淺談Java中return和finally的問題
這兩天學(xué)到了異常機制,其中try...catch...finally個人覺得算是重要的一環(huán),聯(lián)系到之前學(xué)的語句,遇到了return和finally這個好玩的問題,經(jīng)過試驗,發(fā)現(xiàn)計算機語言這種邏輯關(guān)系果然微妙,以下是自己的見解,若有不對之處,望各位前輩指點:
首先看第一段代碼
public class return_finally{ public static void main(String[] args){ System.out.println( m_1() ); } public static int m_1(){ int i=10; try{ System.out.println( "start" ); return i+=10; }catch(Exception e){ System.out.println( "error: "+e ); }finally{ if(i>10){ System.out.println( i ); } System.out.println( "finally" ); } return i; } }
第一段代碼輸出結(jié)果如下:
start
20
finally
20
注意,此時第二個return是在finally語句外部,按照return與finally同時出現(xiàn)的規(guī)定,我們可以理解為第一個return只是一個條件,他的作用只是尋找finally語句,實際只是執(zhí)行了一個i+=10的運算,然后直接進入finally語句,最后return返還結(jié)果。
我們再看第二段代碼:
public class return_finally{ public static void main(String[] args){ System.out.println( m_1() ); } public static int m_1(){ int i=10; try{ System.out.println( "start" ); return i+=10; }catch(Exception e){ System.out.println( "error: "+e ); }finally{ if(i>10){ System.out.println( i ); } System.out.println( "finally" ); return 50; } } }
第二段代碼與第一段的區(qū)別只是將最后的return放到了finally語句當(dāng)中,我們可以猜猜輸出的結(jié)果:
start
20
finally
50
此時執(zhí)行的return已經(jīng)將之前運算結(jié)果所得的20覆蓋,并且返還了50這個數(shù)值,也就是說在finally語句中的return是執(zhí)行了,呃,應(yīng)該可以這樣說吧~~
還有第三段代碼,大家慢慢享受:
public class return_finally{ public static void main(String[] args){ System.out.println( m_1() ); } public static int m_1(){ int i=10; try{ System.out.println( "start" ); return i; }catch(Exception e){ System.out.println( "error: "+e ); }finally{ if(i>10){ System.out.println( i ); } System.out.println( "finally" ); i=50; } return i; } }
此時finally語句中多了i=50,那么結(jié)果是什么呢?
start
finally
10
這就是結(jié)果,finally語句中沒有return語句,那么原來的返回值就不會變化。
那么通過這三個例子可不可以這樣理解:
碰到try語句中的return,先把值儲存到一個地方,然后尋找finally語句,如果語句中有新的算法,就從那個空間取出這個值進行運算,finally中有return的話就就把“新值”覆蓋那個空間的“舊值”,并最終返回;如果finally中沒有return就直接將那個空間中的“舊值”取出來然后返還回去。
以上純屬理解,希望大家多多指點,謝謝各位的幫助!
相關(guān)文章
Java線程池ThreadPoolExecutor原理及使用實例
這篇文章主要介紹了Java線程池ThreadPoolExecutor原理及使用實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05Java中json與javaBean幾種互轉(zhuǎn)的講解
今天小編就為大家分享一篇關(guān)于Java中json與javaBean幾種互轉(zhuǎn)的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03Java中關(guān)于控制臺讀取數(shù)字或字符串的方法
下面小編就為大家?guī)硪黄狫ava中關(guān)于控制臺讀取數(shù)字或字符串的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10