簡體   English   中英

哪些全都處於未經檢查的例外之下?

[英]Which all comes under unchecked exception?

我與一位資深的人討論了Java上的Exception概念
如果我通過擴展Exception類創建一個類,那么它將被檢查異常
如果我通過擴展Throwable,RuntimeException或Error創建一個類,則將取消選中它

以上說法正確嗎?
注意:我已經通過此鏈接何時選擇已檢查和未檢查的異常

編輯:
在回答@Daemon時,他說
“另一方面,Throwable是由Exception擴展的,因此是經過檢查的異常。”
我有一個問題:Throwable也由Error擴展,所以為什么不選中它呢?

任何擴展Exception但不擴展RuntimeException Java程序不應該使用ErrorThrowable ,因為Error旨在傳達嚴重的,不可恢復的問題,例如完全耗盡內存,硬件問題等。

從技術上講,只有擴展Exception類才是異常。 Error和其他Throwable也不例外,並且不應被常規程序捕獲。

您正確地認為,任何擴展Exception的類都是被檢查的異常,但是您對下一條語句感到誤解:

如果我通過擴展Throwable,RuntimeException或Error創建一個類,則將取消選中它

如果擴展RuntimeException或Error,則您的類將是未經檢查的異常。

另一方面,Throwable由Exception擴展,與Exception類似,它是一個已檢查的異常。

下面的代碼實際演示了這些。 有關更多信息, Barry Ruzek的“有效Java異常”使您對該主題的閱讀非常有趣。

public class JavaExceptions {

    public static void throwException() throws Exception {
        throw new Exception("This is a Checked Exception.");
    }

    public static void throwRuntimeException() throws RuntimeException {
        throw new RuntimeException("This is a Runtime Exception.");
    }

    public static void throwError() throws Error {
        throw new Error("This is an Error.");
    }

    public static void throwThrowable() throws Throwable {
        throw new Throwable("This is a Throwable.");
    }

    public static void main (String... args) {

        //Exception extends Throwable, thus both are checked Exceptions.
        try {
            throwThrowable();
            throwException();
        } catch (Throwable e) {
            //Handle exception (or throwable in this case)...
            e.printStackTrace();
        }

        //RuntimeException and Error are both unchecked exceptions.
        throwRuntimeException();
        throwError();
    }
}

編輯1:關於Error及其使用,取自Oracle文檔

錯誤是Throwable的子類,它指示合理的應用程序不應嘗試捕獲的嚴重問題。 大多數此類錯誤是異常情況。 ThreadDeath錯誤雖然是“正常”情況,但它也是Error的子類,因為大多數應用程序都不應嘗試捕獲它。 不需要方法在其throws子句中聲明可能在方法執行期間拋出但未被捕獲的Error的任何子類,因為這些錯誤是不應該發生的異常情況。 也就是說,出於編譯時檢查異常的目的,Error及其子類被視為未檢查的異常。

編輯2:我們在這里處理的類可以描述如下:

Throwable extends Object :應該由需要拋出的任何類(例如Exceptions和Errors)擴展的頂級類。 檢查 Throwable 請參閱: Throwable(Java Platform SE 7)

Error extends Throwable :的子類Throwable ,表示嚴重的問題,合理的應用程序不應該試圖捕獲。 覆蓋Throwable功能以使其不受控制 請參閱: 錯誤(Java Platform SE 7)

Exception extends Throwable :另一個子類Throwable指示條件合理的應用程序想要捕獲的。 就像Throwable一樣,被檢查 請參閱: 異常(Java Platform SE 7)

RuntimeException extends Exception :在Java虛擬機的正常操作期間可以拋出的那些異常的超類。 覆蓋Exception功能以使其不受檢查 請參閱: RuntimeException(Java Platform SE 7)

從oracle文檔中:“出於編譯時檢查異常的目的,Throwable以及Throwable的任何子類都不是RuntimeException或Error的子類。”因此,您的第一個語句是正確的,第二個不是。 您可以在SCJP Sun Java 6認證程序員中閱讀更多內容。 356-380。

如果我通過擴展Exception類創建一個類,那么它將被檢查異常

這是對的。

如果我通過擴展Throwable,RuntimeException或Error創建一個類,則將取消選中它

這是不正確的。 RuntimeException和它的子類,類Error及其子類是未經檢查的異常類。 因為編譯器不會強制將它們在throws子句中聲明。 屬於Throwable層次結構的所有其他異常類都是已檢查的異常。

異常類和錯誤類都擴展了Throwable類。 RuntimeException類擴展Exception類。 被檢查的異常應該是使用try catch或在編譯時拋出的句柄。 不需要RunTimeExceptions的那種處理。 錯誤不應該被處理,而要讓它們發生是因為它們是嚴重的事情。

暫無
暫無

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

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