簡體   English   中英

在java中的finally塊后,return語句如何工作?

[英]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寫入“意外或不可預測的東西”。

  1. 如果執行沒有異常或錯誤,則方法返回一些值。
  2. finally塊對return語句是否執行沒有任何影響。 (當然, finally塊不應該拋出任何進一步的異常)
  3. catch塊確定是否應該進一步傳播該異常或在該方法中處理該異常。

在給定的示例中,從try塊拋出ArithmeticException ,它將由相應的catch塊處理。 由於catch塊再次拋出相同的異常,因此return語句永遠不會執行。

簡而言之, return c; 永遠不會在上面的程序中執行,變量c將被刪除為任何其他局部變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM