懵逼了,try和finally中都有return
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
66套java從入門到精通實(shí)戰(zhàn)課程分享?
關(guān)于try{return}finally{return},這類的問題,面試中很常見,而且有時(shí)候現(xiàn)實(shí)碼代碼中也會(huì)碰到,所以乘著今天不是很忙的情況下,我無意中想起了自己還不是非常清楚的try...return和finally...return,看了無數(shù)遍理論知識(shí)不如自己測試來的實(shí)在,
首先復(fù)習(xí)已有的知識(shí)知道:return 是可以當(dāng)作終止語句來用的,我們經(jīng)常用它來跳出當(dāng)前方法,并返回一個(gè)值給調(diào)用方法。然后該方法就結(jié)束了,不會(huì)執(zhí)行return下面的語句。finally :無論try語句發(fā)生了什么,無論拋出異常還是正常執(zhí)行。finally語句都會(huì)執(zhí)行。
然后測試效果如下。
初級(jí)版測試

首先呢,這兩個(gè)地方必須得有一個(gè)return,否則編譯都通不過,如果有人給你的是上面截圖這種的,你可以很自信的告訴他,對(duì)不起,你的代碼編譯都通不過。
1、在finally中放return
猜想:這種情況很簡單,因?yàn)閒inally語句塊里有了return,那么一定返回的是finally中的str,所以運(yùn)行結(jié)果應(yīng)該是ccc
運(yùn)行結(jié)果:

所以猜想正確。
2、在finally外面放return
猜想:難道這種放的和第一種放的會(huì)不一樣嗎?所以大膽猜想,結(jié)果應(yīng)該還是ccc。
運(yùn)行結(jié)果:

運(yùn)行結(jié)果居然是bbb,是不是很吃驚,what?居然和猜想不一樣?當(dāng)然這時(shí)候小編決定debug,看看它是怎么走的,最終發(fā)現(xiàn),當(dāng)運(yùn)行到finally里面的str="ccc"的時(shí)候,并沒有走finally下面的這個(gè)return,而是直接到main方法里的
String ff = Test002.ff();這里了,說明這里執(zhí)行的是try語句塊里的return了,所以這是為什么呢?
趕緊翻看各種文檔,網(wǎng)上查資料,
最終你會(huì)看到j(luò)vm官方文檔里有關(guān)于try catch finally的說明

不知道大家的英語怎么樣,能不能翻譯一下
通過有道、百度翻譯,大概內(nèi)容是這樣的
如果try語句里有return,那么代碼的行為如下:1.如果有返回值,就把返回值保存到局部變量中2.執(zhí)行jsr指令跳到finally語句里執(zhí)行3.執(zhí)行完finally語句后,返回之前保存在局部變量表里的值
所以看到這里,大家應(yīng)該差不多清楚了吧。
3、去掉try語句塊里的return
上面第2種說到是沒有走finally下面的這個(gè)return 的,如果把try語句塊里的return去掉,這時(shí)候不管下面的這個(gè)return是放在finally里面還是外面,這時(shí)候相當(dāng)于程序運(yùn)行從上到下,遇到return截止,所以運(yùn)行結(jié)果最終是“ccc”

以上的測試代碼,小編放在這里,想要測試的小伙伴們,可以直接測試
public class Test002 {public static void main(String[] args) {String ff = Test002.ff();System.out.println(ff);}public static String ff(){String str = "aaa";try {str = "bbb";return str;}catch (Exception e){e.printStackTrace();}finally {str = "ccc";//return str;}return str;}}
高級(jí)版測試
下面小編就不一一介紹了,相信大家都已經(jīng)明白了,只不過是將字符串變成++i?這種形式


這兩種情況和上面的初級(jí)版測試字符串的是一樣的,所以上面清楚了,這個(gè)應(yīng)該也清楚了
但是當(dāng)變成?i++的形式之后,你就會(huì)發(fā)現(xiàn)......


代碼放這里了,想測試的小伙伴們,可以拿去測試哦
public class Test002 {public static void main(String[] args) {int ff = Test002.ff();System.out.println(ff);}public static int ff(){int str = 1;try {str = str++;return str;}catch (Exception e){e.printStackTrace();}finally {str = str++;//return str;}return str;}}
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循?CC 4.0 BY-SA?版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。
本文鏈接:
https://blog.csdn.net/qq_27471405/article/details/80928623
粉絲福利:108本java從入門到大神精選電子書領(lǐng)取
???
?長按上方鋒哥微信二維碼?2 秒 備注「1234」即可獲取資料以及 可以進(jìn)入java1234官方微信群
感謝點(diǎn)贊支持下哈?
