2013-04-13 38 views
2

我有一些代碼將一個字符串(用戶輸入)拆分爲一個數組,並將該數組的元素作爲參數傳遞給一個方法。如果數組沒有足夠的元素,則會自動拋出ArrayIndexOutOfBoundsException。但是,這是一個未經檢查的異常,因爲這是用戶輸入錯誤的問題,所以我可以事先檢查此情況並拋出一個檢查異常。Java:捕捉異常 - 未檢查與檢查

所以,我有幾個問題:

  1. 難道是更好的形式來處理未經檢查的異常或拋出一個檢查嗎?
  2. 如果我確實拋出檢查異常,我應該使用IllegalArgumentException?我的理解是,它是針對非法參數類型的,而不是非法的參數數量。

謝謝。

+0

感謝您的所有偉大的答案! –

回答

3

檢查異常是那些編譯器強迫你處理的情況,而非檢查異常情況不屬於這種情況。現在根據你的問題,你的代碼應該以一種方式編寫,這樣就不會出現任何情況,從而引發未經檢查的異常(例如: - null pointerexception,ArrayIndexOutOfBoundsException)。

如果您的代碼拋出未經檢查的異常,那麼代碼中存在問題。正如你指出你的情況,輸入數據是不正確的,那麼理想情況下,你應該對輸入進行驗證,不管它是否與期望的一樣,並給出錯誤信息,所以不會有任何需要將未檢查的異常轉換爲檢查一個

因此,在理想的世界中,沒有必要將未檢查的異常轉換爲檢查異常。是的,如果有特定情況,我們可以在技術上做到這一點。

2

處理未檢查的異常或拋出檢查的異常會更好嗎?

最好是拋出一個檢查異常,指出用戶輸入存在問題。未經檢查的異常應保留以指示編程問題,如果不更改代碼,則無法從中恢復;用戶輸入不是這些問題之一。

如果我確實拋出檢查異常,我應該使用IllegalArgumentException?我的理解是,它是針對非法參數類型的,而不是非法的參數數量。

如果您的設計約束條件允許您使用特定於應用程序的異常,請針對無效的用戶輸入設計一個。這會使使用API​​的代碼更加明確地表明它期望的異常。

2

如果您有辦法重新提示用戶輸入正確的信息,即是否有合乎邏輯的方式來處理異常,請這樣做。如果你期望有人進入調用堆棧來處理異常,那麼拋出一個檢查的異常。如果你只是放棄了,那麼讓未經檢查的異常通過(或者爲了任何記錄器最終要捕獲它的好處而在更多信息的RuntimeException中重新包裝它)。這是所有例外的一般建議。 (另外,不要記錄一個異常並重新拋出 - 記錄它或重新拋出它,而不是兩者。)

1

基本上,當你決定處理運行時異常,在你的情況下,ArrayIndexBoundofExcepgtion,你可能會繼續進行下去,而不會突然中斷應用程序。

因此,如果您的數組沒有足夠的數據,那麼該做什麼或不該做什麼就是您的業務決定。如果它確實影響業務數據流,最好處理一個檢查的異常,以便您可以清理輸入數據。

1

處理未檢查的異常或拋出檢查的異常會更好嗎?

拋出未經檢查的異常。你總是可以抓到一個RuntimeException並前進。然後我再次偏向未經檢查的例外,因爲我不喜歡所有檢查過的例外。

如果我確實拋出檢查異常,我應該使用IllegalArgumentException?

是的,它應該按照下面的javadoc報價。如果你想傳達更具體的東西,你可以創建自己的檢查異常。這取決於你的設計。

拋出以指示方法已通過非法或不恰當的參數。

2
Would it be better form to handle the unchecked exception or throw a checked one? 

這將是最好的驗證輸入你試圖對其進行處理,並要求用戶再次嘗試,如果它是無效的了。