淺談Java中return和finally的問(wèn)題
這兩天學(xué)到了異常機(jī)制,其中try...catch...finally個(gè)人覺(jué)得算是重要的一環(huán),聯(lián)系到之前學(xué)的語(yǔ)句,遇到了return和finally這個(gè)好玩的問(wèn)題,經(jīng)過(guò)試驗(yàn),發(fā)現(xiàn)計(jì)算機(jī)語(yǔ)言這種邏輯關(guān)系果然微妙,以下是自己的見(jiàn)解,若有不對(duì)之處,望各位前輩指點(diǎ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
注意,此時(shí)第二個(gè)return是在finally語(yǔ)句外部,按照return與finally同時(shí)出現(xiàn)的規(guī)定,我們可以理解為第一個(gè)return只是一個(gè)條件,他的作用只是尋找finally語(yǔ)句,實(shí)際只是執(zhí)行了一個(gè)i+=10的運(yùn)算,然后直接進(jìn)入finally語(yǔ)句,最后return返還結(jié)果。
我們?cè)倏吹诙未a:
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語(yǔ)句當(dāng)中,我們可以猜猜輸出的結(jié)果:
start
20
finally
50
此時(shí)執(zhí)行的return已經(jīng)將之前運(yùn)算結(jié)果所得的20覆蓋,并且返還了50這個(gè)數(shù)值,也就是說(shuō)在finally語(yǔ)句中的return是執(zhí)行了,呃,應(yīng)該可以這樣說(shuō)吧~~
還有第三段代碼,大家慢慢享受:
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; } }
此時(shí)finally語(yǔ)句中多了i=50,那么結(jié)果是什么呢?
start
finally
10
這就是結(jié)果,finally語(yǔ)句中沒(méi)有return語(yǔ)句,那么原來(lái)的返回值就不會(huì)變化。
那么通過(guò)這三個(gè)例子可不可以這樣理解:
碰到try語(yǔ)句中的return,先把值儲(chǔ)存到一個(gè)地方,然后尋找finally語(yǔ)句,如果語(yǔ)句中有新的算法,就從那個(gè)空間取出這個(gè)值進(jìn)行運(yùn)算,finally中有return的話(huà)就就把“新值”覆蓋那個(gè)空間的“舊值”,并最終返回;如果finally中沒(méi)有return就直接將那個(gè)空間中的“舊值”取出來(lái)然后返還回去。
以上純屬理解,希望大家多多指點(diǎn),謝謝各位的幫助!
- 關(guān)于Java中try finally return語(yǔ)句的執(zhí)行順序淺析
- 淺談Java finally語(yǔ)句到底是在return之前還是之后執(zhí)行(必看篇)
- 談?wù)凧ava中try-catch-finally中的return語(yǔ)句
- Java異常處理中同時(shí)有finally和return語(yǔ)句的執(zhí)行問(wèn)題
- java異常處理執(zhí)行順序詳解try catch finally
- 詳解Java Web項(xiàng)目啟動(dòng)執(zhí)行順序
- java中靜態(tài)代碼塊與構(gòu)造方法的執(zhí)行順序判斷
- 詳解Java中finally和return的執(zhí)行順序
相關(guān)文章
Java線(xiàn)程池ThreadPoolExecutor原理及使用實(shí)例
這篇文章主要介紹了Java線(xiàn)程池ThreadPoolExecutor原理及使用實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05Java9中對(duì)集合類(lèi)擴(kuò)展的of方法解析
這篇文章主要介紹了Java9 中對(duì)集合類(lèi)擴(kuò)展的of方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java中json與javaBean幾種互轉(zhuǎn)的講解
今天小編就為大家分享一篇關(guān)于Java中json與javaBean幾種互轉(zhuǎn)的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03Springboot集成定時(shí)器和多線(xiàn)程異步處理操作
這篇文章主要介紹了Springboot集成定時(shí)器和多線(xiàn)程異步處理操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09Java中關(guān)于控制臺(tái)讀取數(shù)字或字符串的方法
下面小編就為大家?guī)?lái)一篇Java中關(guān)于控制臺(tái)讀取數(shù)字或字符串的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10Java讀取txt文件和寫(xiě)入txt文件的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇Java讀取txt文件和寫(xiě)入txt文件的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(27)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07