簡體   English   中英

是不是在try塊中捕獲的未經檢查的異常在Java中檢查了異常?

[英]Isn't an unchecked exception that is caught in a try block a checked exception in Java?

有人告訴我,在Java中,未經檢查的異常可以在try塊中捕獲,但如果它被捕獲,是不是稱為已檢查異常?

未經檢查的異常是不需要在try - catch塊中捕獲的異常。 未經檢查的異常是RuntimeExceptionError類的子類。

已檢查的異常是需要在try - catch塊中捕獲的異常。

有關已檢查和未檢查異常的定義,請參見第11.2節:編譯時檢查 Java語言規范 的異常

未經檢查的異常類是RuntimeException類及其子類,以及類Error及其子類。 所有其他異常類都是已檢查的異常類。

僅僅因為在catch塊中捕獲未經檢查的異常不會使其成為已檢查的異常 - 它只是意味着捕獲了未經檢查的異常,並且在catch塊中處理。

可以catch未經檢查的異常,然后throw一個新的已檢查異常,因此調用該方法的任何方法都可能發生未經檢查的異常,並強制調用它來處理某種異常的方法。

例如,在向Integer.parseInt方法處理一些不可解析的String時可以拋出的NumberFormatException是一個未經檢查的異常,因此不需要捕獲它。 但是,調用該方法的方法可能希望其調用者正確處理這樣的問題,因此它可能會拋出另一個被檢查的異常(不是RuntimeException的子類)。

public int getIntegerFromInput(String s) throws BadInputException {
    int i = 0;
    try {
        i = Integer.parseInt(s);
    catch (NumberFormatException e) {
        throw new BadInputException();
    }

    return i;
}

在上面的示例中,在try - catch塊中捕獲NumberFormatException ,並BadInputException新的BadInputException (旨在作為已檢查的異常)。

getIntegerFromInput方法的任何調用者都將被強制捕獲BadInputException ,並被迫處理錯誤的輸入。 如果不捕獲和處理NumberFormatException則此方法的任何調用者都必須正確處理異常。

(另外,應該注意的是,吃異常並做一些不重要的事情並不是一種好的做法 - 處理可以執行有意義的異常處理的異常。)

來自Java教程:

不,它不會因為它被捕獲而被稱為已檢查的異常。 可以編寫一個catch塊來捕獲任何類型的異常或錯誤。 已檢查的異常是受Catch或Specify Requirement約束的異常,這意味着您需要捕獲它們或聲明您的方法可能拋出它們。 你可以認為術語檢查作為這意味着編譯器會檢查,以確保你堅持抓或指定要求的。 錯誤和RuntimeExceptions被稱為未經檢查的異常,因為編譯器不對它們強制執行此要求。

我認為區別在於編譯器將標記未捕獲的已檢查異常和拋出已檢查異常的方法,但在編譯時不會在方法簽名中聲明它們。

未經檢查的例外不需要聲明或捕獲,但兩者都不被禁止。 編譯器只是不將它們識別為錯誤。

暫無
暫無

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

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