我們知道return會結束此方法並返回指定值。以及在Try-catch-finally中無論try代碼塊中有沒有異常finally中的代碼時都會被執行的。但是如果return包含在try-catch-finally中的try或catch塊中會怎樣呢?
我們再做個試驗:
1 static int txt(){ 2 try { 3 @SuppressWarnings("unused") 4 int a=5/0; 5 7 } catch (Exception e) { 8 System.out.println("catch"); 9 return 2; 10 }finally{ 11 System.out.println("finally"); 12 } 13 return 3; 14 }
看上面代碼我們知道在try中”int a=5/0”是肯定會報錯的接下來程序會進入catch中進行異常處理但是在catch中使用return 返回了一個2;這時finally中的代碼到底還會會走呢?如果finally中的代碼走了的話,return返回的結果又是什么?
我們來開一下調用此方法輸出的結果:
我們可以看到finally塊即使catch塊有return他還是會被執行的
我們再來開下面一個例子
1 static int txt(){ 2 try { 3 4 int a=5/0; 5 6 7 } catch (Exception e) { 8 System.out.println("catch"); 9 return 2; 10 }finally{ 11 System.out.println("finally"); 12 return 3; 13 } 14 15 }
這時return返回的又是多少呢?
話不多時來看結果吧:
我們可以這摸理解:我們定義一個有返回值類型的方法時系統會自動聲明一個堆棧上的內存地址用來存放此方法返回的值這也是我們定義一個有返回值類型的方法卻沒有給定返回值是產生編譯錯誤的原因!當程序執行到catch塊的return時會吧return后面的值存放在事先聲明的堆棧內存中並不結束此方法后再執行finally塊的代碼,但是finally塊中也有return關鍵字所以在事先聲明的堆棧內存中保存的值也就變成了finally塊中return后面的值。又因為finall塊后有沒有強制執行的代碼塊所以此方法結束。
以上內容為個人理解如有 不足之處請各位大神多多指正。
思考:
1 static int txt(){ 2 int a=1; 3 try { 4 5 a++; 6 return a; 7 8 }finally{ 9 ++a; 10 } 11 }
此方法的返回值是多少。


