在這個論壇上的大部分答案一直在討論Exception層次結構和Java編譯器沒有捕獲它們,但我會嘗試從設計角度回答這個問題,爲什麼也許這樣設計。
基本上當你調用一個函數(或寫一些代碼)的異常可以根據三種不同的情況被扔出來的:
根據一個不可避免的條件如網絡或一些不可用文件系統上缺少預期的文件。
基於可避免的,但已知的條件像Integer.parseInt(String)
可以拋出NumberFormatException
如果主叫方傳遞一個不能轉換的串像"Hello"
,但主叫方可以確保到位正確驗證的任何字符串傳遞給函數之前,徹底廢除並有可能產生異常。一個常見的用例可能是在將網頁傳遞給進行轉換的更深層之前,在網頁上驗證表單域age
。
一個未知的或意外的情況任何時候的一些代碼行可以在你的代碼,因爲有一些錯誤,你這樣做,直到它在生產升空並沒有觀察到錯誤條件拋出一個異常,一般情況與NullPointer Reference
,IndexOutOfBounds
等,而如果觀察到將可能落入類別2
1類的異常通常被設計爲Checked Exceptions
,因爲它需要執行爲不可避免的錯誤條件的檢查,並執行其回退。例如,IOException是檢查異常,因爲如果你打開一個文件,可能會有很多事情可能會出錯(如文件可能被刪除,權限等),並預先驗證所有這些都可能非常麻煩。
第二種類型的例外通常建模爲Unchecked Exceptions
,因爲您可能已經進行了預驗證,並且在您已經處理的情況下被迫使用try and catch可能會令人惱怒。
第三種類型的異常不需要甚至擔心,因爲您不能在應用程序代碼的每個語句中出現意外出現的錯誤處理。但是有時候你可以放置一個全局處理器,在調用堆棧中的某處,幾乎所有的應用程序代碼都被執行,並以通用的方式處理它,這樣應用程序就不會因意外錯誤而崩潰。
例如,如果您運行的是Web應用程序,則可以配置您的Servlet容器以發送一個通用的500 Internal Server Error
用於應用程序中的任何未處理的錯誤。或者,如果您正在運行獨立的Java應用程序,則可以將main method
的內容保留在try catch
塊中以防止應用程序崩潰。
請注意,當發生編程/代碼邏輯錯誤時,通常會引發'RuntimeExceptions'。解決方案通常只是修補代碼。你通常不應該抓住他們。 – BalusC 2010-05-01 16:21:06
真的嗎?我認爲最好的做法之一是將檢查到的異常轉換爲未經檢查的異常,而不是將它們全部在一個地方顯示給用戶? – vodkhang 2010-05-01 16:41:45
@vodkhang我想說的是,爲什麼編譯器不會禁止代碼,當它清楚地發生RuntimeException將會發生。 – 2010-05-01 16:56:40