2013-12-09 97 views
15

在例外層次結構中, RuntimeException的後代和Error的後代是運行時異常/錯誤。RuntimeException&Error

這兩者之間的區別是:那些RuntimeException下是 差引起的編程/設計的那些,和那些的Error是 不能/不應由顯影劑所控制的那些。

爲了編碼應用程序中的異常,例如 ,當發生業務邏輯中的某事時拋出異常, RuntimeException被擴展。

的問題是,究竟是擴展 RuntimeException和擴展Error之間的區別 - 除了延長 Error是不好的做法?

+0

誰說它*是壞習慣?當然不是你每天都會做的事情,但我並不懷疑有些情況下它可能是值得的。 –

+0

@HotLicks Joshua Bloch建議在他的着作Effective Java中這樣做:「雖然Java語言規範並不要求它,但有一個強大的約定,即錯誤被JVM用來指示資源缺陷,不變的故障或其他由於幾乎普遍接受這個約定,所以最好不要使用 來實現任何新的Error子類。因此,**所有未實現的可執行的throwables應該繼承** RuntimeException(直接或間接的)。」 – alfasin

+0

@alfasin - 因此XYZ操作系統可能在檢索系統時鐘時檢測到硬件故障,但它不應該調用該錯誤?一個控制化學工廠閥門的API可能會檢測到硬件故障,並且不應該將其稱爲錯誤? –

回答

15

ErrorRuntimeException都是未經檢查的例外,這意味着它表示程序存在缺陷,通常不應被捕獲。 (NullPointerExceptionIndexOutOfBoundsException等)

我認爲兩者之間的主要區別是,RuntimeException表明存在有該程序的錯誤,並且Error的東西是致命的,但出來的程序的控制。 (OutOfMemorryErrorThreadDeath等)

因此繼承的Error是不好的做法,因爲錯誤通常是沒有的東西,可能你的程序在運行時固定。在你的程序中,如果你需要扔東西,請使用Exception

+1

我已經在Q. – Roam

+0

中說過這些了,我認爲應該回答你的問題 – Pita

+1

再加粗。也許這次它會說不會在Q. – Roam

6

的Q是,究竟是擴展 RuntimeException的和不同之處在於擴展錯誤擴展Error--是 不好的做法有什麼區別?

你已經提到了主要的區別。 The Java Language Specification says the same thing in different terms。對於Error,它指出

Error是從普通 程序不是通常預期的恢復的所有異常的超類。

對於RuntimeException,它指出

RuntimeException是異常的直接子類。 RuntimeException是所有異常的超類,可能是 在表達式評估期間拋出的原因很多,但從中可以得出 仍可能回收

你應該從這些報價拿走的是,你通常會看到

try { 
    ... 
} catch (Exception e) { // catches RuntimeException 
    ... 
} 

爲包羅萬象的情況下,因爲Exception是一個超級類型的RuntimeException。但你幾乎永遠不會看到(我從來沒有見過)

try { 
    ... 
} catch (Error e) { 
    ... 
}