簡體   English   中英

Java:捕獲異常 - 未選中vschecked

[英]Java: Catching exception - unchecked vs.checked

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

所以,我有幾個問題:

  1. 處理未經檢查的異常或拋出已檢查的異常會更好嗎?
  2. 如果我拋出一個已檢查的異常,我應該使用IllegalArgumentException嗎? 我的理解是它是非法的參數類型,而不是非法的參數。

謝謝。

已檢查的異常是編譯器強制您處理的異常,而未經檢查的異常則不是這種情況。 現在根據您的問題,您應該以一種方式編寫代碼,以便不會出現任何情況,以便拋出未經檢查的異常(例如: - null pointerexception,ArrayIndexOutOfBoundsException)。

如果您的代碼拋出未經檢查的異常,則代碼中存在問題。 正如您在案例中指出的那樣,輸入數據不正確,那么理想情況下您應該對輸入進行驗證是否是預期的並給出錯誤消息,因此不需要將未經檢查的異常轉換為已檢查的異常

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

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

拋出一個指示用戶輸入問題的檢查異常會更好。 應保留未經檢查的異常,以指示在不更改代碼的情況下無法恢復的編程問題 ; 用戶輸入不是這些問題之一。

如果我拋出一個已檢查的異常,我應該使用IllegalArgumentException嗎? 我的理解是它是非法的參數類型,而不是非法的參數。

如果您的設計約束允許您使用特定於應用程序的異常,請針對無效用戶輸入的情況設計一個。 這將使使用您的API的代碼更清楚地了解它所期望的異常。

如果您有辦法重新提示用戶輸入正確的內容,即是否有合理的方法來處理異常,那么請執行此操作。 如果你期望有人進一步調用堆棧來處理異常,那么拋出一個已檢查的異常。 如果您只是放棄,那么讓未經檢查的異常通過(或者在更具信息性的RuntimeException中重新打包它,以獲得最終捕獲它的任何記錄器的好處)。 這是所有例外情況的一般建議。 (另外,不要記錄異常並重新拋出它 - 記錄它或重新拋出它,而不是兩者。)

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

最好在嘗試處理輸入之前驗證輸入,並要求用戶再次嘗試輸入它是否無效。

基本上,當您決定處理Runtime異常時,在您的情況下,ArrayIndexBoundofExcepgtion,您可能會在沒有突然中斷應用程序的情況下繼續進行。

因此,如果您的陣列沒有足夠的數據,那么您的業務決定是什么。如果它確實影響業務數據流,最好處理已檢查的異常,以便您可以清理輸入數據。

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

拋出未經檢查的異常。 您始終可以捕獲RuntimeException並繼續前進。 然后我再次偏向未經檢查的異常,因為我不喜歡所有已檢查的異常。

如果我拋出一個已檢查的異常,我應該使用IllegalArgumentException嗎?

是的,它應該通過下面的javadoc引用。 如果要傳達更具體的內容,可以創建自己的已檢查異常。 這取決於你的設計。

拋出以指示方法已被傳遞非法或不適當的參數。

我建議避免檢查異常。 有關支持參數,請參閱以下內容:

是否定義自己的類來擴展RuntimeException並拋出它或者只是允許拋出ArrayIndexOutOfBoundsException取決於上下文。 通常,后者就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM