[英]How does a return statement work after a finally block in java?
這是“Java All-in-one桌面參考”一書中的一個例子
public class CrazyWithZeros {
public static void main(String[] args) {
try {
int answer = divideTheseNumbers(5, 0);
} catch (Exception e) {
System.out.println("Tried twice, still didn't work!");
}
}
public static int divideTheseNumbers(int a, int b) throws Exception {
int c;
try {
c = a / b;
System.out.println("It worked!");
} catch (Exception e) {
System.out.println("Didn't work the first time.");
c = a / b;
System.out.println("It worked the second time!");
} finally {
System.out.println("Better clean up my mess.");
}
System.out.println("It worked after all.");
return c;
}
}
執行finally子句后,ArithmeticException將被拋回到調用方法。 語句System.out.println("It worked after all.");
在這種情況下永遠不會被執行。 但是return c;
發生了什么return c;
?
我想知道返回陳述是否仍會返回分裂的結果?
========
我試圖替換“ System.out.println("Better clean up my mess.");
”with“ System.out.println(c);
”,然后它被編譯,結果如下:
Didn't work the first time. 0 Tried twice, still didn't work!
我無法相信變量c
可以計算出來。 (但這是錯誤的數字)為什么會發生這種情況?
然后我也嘗試替換“ System.out.println("Better clean up my mess.");
”with“ return c;
”並刪除finally塊下面的語句,再次編譯...由於finally塊是執行是否由try塊拋出任何異常或由任何catch塊捕獲,返回c; 應該執行。 但結果如下:
第一次沒工作。
看起來像c
無法返回...
也不執行return c。 它直接進入main方法中的catch塊。
您希望第二次執行容易出錯的操作是什么? :)
它會生成一個與catch
塊中相同類型的異常,但是當時它不會被處理 - 你在這個 catch
塊中沒有另一個try-catch
。
無論是否發生異常或正常的流程進行,都始終執行finally
。 在你的情況下,你來到帶有異常的finally
塊並將它拋給調用者( main
),在那里它由自己的catch
塊處理。
我想知道返回陳述是否仍會返回分裂的結果?
你想要什么回報? 您尚未初始化變量c
並且此變量沒有正確的記錄。 因此,Java不允許在c
寫入“意外或不可預測的東西”。
finally
塊對return語句是否執行沒有任何影響。 (當然, finally
塊不應該拋出任何進一步的異常) catch
塊確定是否應該進一步傳播該異常或在該方法中處理該異常。 在給定的示例中,從try
塊拋出ArithmeticException
,它將由相應的catch
塊處理。 由於catch
塊再次拋出相同的異常,因此return
語句永遠不會執行。
簡而言之, return c;
永遠不會在上面的程序中執行,變量c
將被刪除為任何其他局部變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.