2010-03-25 24 views
47

採取此法重要參數/依賴關係丟失時拋出什麼異常?

/** 
* @return List of group IDs the person belongs to 
* 
*/ 
public List<String> getGroups() { 
    if (this.getId().equals("")) return null; 
} 

我想拋出異常,而不是返回null,什麼時候一個重要的參數/相關性尚未設置拋出異常?

+6

如果'getID()'返回null,則此代碼將引發NPE。最好使用'if(「」.equals(this.getId()))...' – 2010-03-25 17:47:55

+0

我在抽象類中定義了它,並且裏面有一個try catch,並且在失敗時將返回空字符串。 – Pentium10 2010-03-25 17:51:41

回答

71

如果參數/參數是從外部控制的,我會使用IllegalArgumentException,如果方法剛剛在錯誤的時刻(狀態)被調用,則使用IllegalStateException。在你的具體情況下,我認爲這是後者。一個(可疑的)替代品是NullPointerException

然而,這應該明確記錄在@throws,以便用戶理解原因。

+0

問題的背景確實有限。據我所知,ISE是最好的選擇。我也明確指出,所以我不明白這是如何不好:) – BalusC 2010-03-25 17:44:57

+0

是否有魔術如何更新Eclipse中的評論部分以自動重新使用缺少的@params並添加@throws部分?也許是一個捷徑? – Pentium10 2010-03-25 17:46:07

+0

對不起,不知道。它會自動添加到非運行時異常(當您生成/更新'throws'子句時),而不是運行時異常。 – BalusC 2010-03-25 17:55:26

2

我會使用IllegalStateException,因爲id是所有者的狀態。如果id已經作爲參數傳遞,則IllegalArgumentException將是正確的。

0

我會通過擴展Exception來創建自己的Exception類型。通過這種方式調用函數可以捕獲特定的異常,並適當地處理它。 請注意,你可以對任何擴展異常做同樣的事情,但我更喜歡創建自己的異常類,所以我可以在異常處理中非常健壯。這當然取決於你。

+0

爲什麼要重新發明輪子? IllegalArgumentException僅適用於非法參數。 – 2010-03-25 18:18:27

+0

這取決於您想要陷入的非法參數的類型。我喜歡擴展Excpetion,或者在這種情況下IllegalArgumentException只是爲了讓一個特定的Exception類來處理我想處理的不同類型的條件。它使異常處理更容易,更強大,恕我直言。 -Jay – Jay 2010-03-25 18:41:41

2

如果無法確保始終設置id(通過在構造函數中要求它,例如,在哪裏可以檢查一個有效的id已通過),那麼我認爲拋出IllegalStateException的其他建議是正確的。但是,如果可能的話,嘗試確保您的對象首先無法進入此狀態

1

而不是拋出異常,您應該返回一個空列表。如果不符合依賴關係/參數,則沒有結果。從發佈的評論和代碼看來,這就是預期的行爲。如果id是空的,那麼沒有組連接,因此是一個空列表。

相關問題