2010-04-09 149 views
2

由於Error和Exception是throwable類的子類,因此我們可以拋出任何錯誤,運行時ex和其他ex。我們也可以捕捉任何這些類型。java中的異常層次結構

爲什麼我們通常只捕獲checked異常?

有人能爲我提供很好的例子鏈接嗎?

回答

6

檢查異常的要點在於您需要捕捉它。這是正常程序執行時可能出現的錯誤類型(例如I/O錯誤),並且應用程序可以正常處理它。

相反,未經檢查的異常是那些在程序的正常運行過程中不應該發生的異常(它們以某種方式破壞規則),因此您不會嘗試處理它,因爲您不太可能做到。

3

我認爲你的前提,未經檢查的例外永遠不會被處理是不正確的。當然,你不應該處理NullPointerException,IndexOutOfBoundsException等等,因爲它們表示編程中的邏輯錯誤,因此捕獲它們實際上隱藏了程序中存在錯誤的事實。但是,有些API具有根植於RuntimeException的異常層次結構,如果是這種情況,那麼您最終可能會捕獲應用程序中的很多應用程序;實際上,我以前開發了一個GUI應用程序,其中需要處理從RuntimeException繼承的大量不同異常,並且此API恰好比Java語言中引發檢查異常的任何API都使用得多,等等在這種情況下實際上是相反的。也就是說,如果有某些事情需要絕對需要處理,按照慣例,這些都會被製成檢查的例外(繼承Exception而不是RuntimeException)。另外,編譯器強制你處理這樣的異常或者聲明它被拋出(這就是「checked exception」的意思)。因此,約定和需求的組合可能是爲什麼你可能會處理比未經檢查的異常更多的檢查(因爲緊急的檢查已經按照慣例被製成檢查過的異常,或者你忽略了重要的未經檢查的異常,因爲你沒有被迫處理它們)。

+0

除非我錯過了一些東西,這聽起來像是一個非常糟糕的設計。如果預計這些異常會被處理,爲什麼你會讓它們從'RuntimeException'繼承? – danben 2010-04-09 01:17:10

+4

這可能是您希望處理「有時」的例外情況。例如。 Spring的JDBC庫將SQLExceptions重新引發爲未經檢查的異常,因爲您可能想要在應用程序層處理它們,或讓它們傳播到容器。 – harto 2010-04-09 01:29:42

+1

@danben,他們沒有被檢查,因爲中間層不需要知道他們,但他們可以發生,並讓用戶看到一個醜陋的打印出來不是一個好主意......通常他們是有時會失敗的操作,只需在這些情況下重新啓動。 – 2010-04-09 02:09:49

1

爲什麼我們通常只捕獲checked異常?

因爲與未檢查的例外(RuntimeException,Error及其子類)不同,您需要捕獲它們。相反,使用未經檢查的異常的一點是,您不需要捕獲它們,它允許軟件「在應用程序之上」(通常是框架,容器或JVM)處理它們。在某些情況下,您可能需要或決定自己處理一個,並明確地進行處理。但那是一種特殊的情況。

有人能爲我提供很好的例子鏈接嗎?

也許Java教程約Exceptions

+0

特殊的答案 – 2010-04-09 01:46:48

0

爲什麼我們通常只抓到檢查 例外?

檢查異常提供了一種強制程序員以一種很好的方式考慮處理可預測錯誤的方法。處理I/O和網絡時,經常會發生這些「可預測的」錯誤。我們更經常捕獲RuntimeExceptions,因爲它們比檢查異常的可預測性要差,並且在編程邏輯中捕獲掩蓋錯誤。例如,捕獲NullPointerException是一種處理null值的懶惰方式,當更好的解決方案是找出爲什麼一個對象是null並直接處理它。當然,有些時候你會想要趕上RuntimeExceptions,比如NumberFormatException

請注意,檢查異常在Java中比大多數語言更重要,甚至像Scala一樣在JVM上構建的語言也沒有檢查異常。

有人能爲我提供 例外的好鏈接嗎?

請參閱http://www.javaworld.com/javaworld/jw-07-1998/jw-07-exceptions.html瞭解Java異常的優秀文章。