2013-08-05 25 views
-1

我在Java中曾與前輩之一的討論異常的概念
如果我通過擴展的Throwable,RuntimeException的,或錯誤通過擴展Exception類,然後如果我創建一個類,將檢查異常
創建一個類,那麼它將被取消選中例外哪些都受到未經檢查的異常?

上述說法正確嗎?
注:我通過這個環節When to choose checked and unchecked exceptions

編輯:
雖然經歷了答案@Daemon,他說:
,另一方面」 Throwable的,是由異常擴大,因此是檢查的異常「。
我有一個問題:Throwable由Error也擴展了,所以爲什麼不是Unchecked?

+0

Throwable是異常/錯誤類什麼是Object對於所有Java類。它定義了所有Java異常應具有的基本方法和屬性(默認情況下)。錯誤與Throwable的關係類似於RuntimeException與Exception的關係。用最簡單的術語來說,錯誤是未選中的Throwables,而RuntimeExceptions是未檢查的異常。規則是:除非另有說明,否則所有Throwable都會被檢查(這是Error和RuntimeException中的情況)。我將編輯我的答案,並對這些類別進行細分。 –

+0

要回答您的問題,錯誤未選中,因爲它們被寫入未選中狀態。一個合理的程序不應該試圖捕捉錯誤,爲什麼迫使他們檢查它們? –

回答

2

任何延伸Exception但不延伸RuntimeExceptionErrorThrowable不應該被Java程序使用,因爲Error旨在傳達嚴重的,不可恢復的問題,例如完全耗盡內存,硬件問題等。

從技術上講,只有延伸Exception的類纔是例外; Error和其他Throwable不是例外,預計不會被常規程序捕獲。

0

如果我創建通過擴展異常類的類那麼這將是 檢查異常

這是正確的。

如果我通過擴展的Throwable,RuntimeException的,或者錯誤創建一個類, 那麼這將是未經檢查的異常

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

0

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

1

從oracle文檔中:「爲了編譯時檢查異常,Throwable和Throwable的任何子類(不是RuntimeException或Error的子類都被視爲檢查異常)。」因此,您的第一條語句是正確的,第二個不是。 您可以在SCJP Sun Certified Programmer for Java 6頁閱讀更多內容。 356-380。

2

你是正確的擴展異常的任何類將是檢查的異常,但是你錯了你的下一個語句:

如果我通過擴展的Throwable,RuntimeException的,或者錯誤,那麼它會創建一個類未經檢查異常

如果你擴展了RuntimeException或Error,你的類將是一個未經檢查的異常。

另一方面,可以拋出異常,像異常是一個檢查異常。

下面的代碼實際上證明了這些。欲瞭解更多信息,Barry Ruzek's "Effective Java Exceptions"作出了一些非常有趣的主題閱讀。

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's Documentation採取:

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

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

Throwable extends Object:應該由需要的任何類來擴展頂級類被拋出(如異常和錯誤)。 Throwable s是檢查。請參閱:Throwable (Java Platform SE 7)

Error extends Throwable:中Throwable子類,指示嚴重的問題,合理的應用程序不應該試圖捕獲。 Overovers Throwable功能變爲未檢查。請參閱:Error (Java Platform SE 7)

Exception extends ThrowableThrowable的另一個子類,指示合理應用程序可能需要捕獲的條件。像Throwable,是檢查。請參閱:Exception (Java Platform SE 7)

RuntimeException extends Exception:在Java虛擬機正常運行期間可引發的那些異常的超類。重寫Exception功能將變爲未選中。請參閱:RuntimeException (Java Platform SE 7)

+0

感謝輸入的例子,但正如你所說'可拋出另一方面,由異常擴展,因此是一個檢查異常',我有一個問題:可拋出擴展錯誤也是,所以爲什麼不是沒有選中? –

+0

這是一個很好的問題。錯誤擴展Throwable,因爲錯誤是可拋出的,但是錯誤應該很少由Java應用程序拋出,而是由JVM在不應該發生的異常情況下拋出。因此,不應將錯誤視爲未經檢查的異常,而是與異常無關的不可恢復的失敗的產物。 –

相關問題