簡體   English   中英

Try,Catch和Finally塊

[英]Try, Catch and Finally blocks

public class D {

void myMethod() {
    try {
        throw new IllegalArgumentException();
    } catch (NullPointerException npex) {
        System.out.println("NullPointerException thrown ");
    } catch (Exception ex) {
        System.out.println("Exception thrown ");
    } finally {
        System.out.println("Done with exceptions ");
    }
    System.out.println("myMethod is done");
}

public static void main(String args[]) {
    D d = new D();
    d.myMethod();
}

}

我不明白為什么"myMethod is done"也被打印出來。 拋出了異常,因此它假設找到一個匹配的catch並執行finally塊,但它繼續在myMethod方法上並打印myMethod is done ,這不是finally塊的一部分。 為什么?

這就是try-catch-finally的工作方式。 因為您捕獲了異常,所以它被認為已被處理,並且執行繼續正常進行。

如果你沒有抓住它,或者重新拋出它,那么“myMethod就完成了”就不會被打印出來,並且異常會在堆棧中冒出來,直到它被別人抓到。

請注意, finally始終執行,異常或否。

另一方面,如果您有以下內容:

void myMethod() {
    try {
        throw new IllegalArgumentException();

        System.out.println("Line after exception");   /// new line added here

    } catch (NullPointerException npex) {
        System.out.println("NullPointerException thrown ");
    } catch (Exception ex) {
        System.out.println("Exception thrown ");
    } finally {
        System.out.println("Done with exceptions ");
    }
    System.out.println("myMethod is done");
}

public static void main(String args[]) {
    D d = new D();
    d.myMethod();
}

然后不會打印“異常后排”

您處理了異常,因此方法處理繼續。

你已經發現了異常,這意味着它不會再傳播。 在try語句之后立即執行,該語句是打印myMethod is done的語句。

從技術上講,您已經處理了異常,因此繼續執行。

據推測它說“拋出異常”,然后“完成異常”,然后“myMethod完成”。 這應該是它應該做的。

因為您自己捕獲異常,所以只有在整個try-catch-finally塊完成后才會繼續執行。 這是一個捕獲聲明的重點。

暫無
暫無

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

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