2012-09-03 157 views
0

要求用戶從某個給定集合中選擇一個ID。我檢查我的收藏中是否存在該ID,如果不是,我會拋出IndexOutOfBoundsException並在稍後抓到它。我是否可以將這種例外情況用於此目的,還是僅僅是一種非常糟糕的做法?拋出異常 - 使用

回答

1

拋出異常沒有什麼意義,如果你面對的真正特殊情況

如果你的類的合同假設不是用戶從不查詢不在值引發異常收集,那麼異常是好的。也許IllegalArgumentException或類似的東西。

否則會導致樣板代碼,並且有時會導致由於堆棧展開和異常傳播顯著的性能下降

所以它是一種權衡是否拋出異常,或者返回一些預先定義的值

我建議在你的情況下返回「null」。

2

如果將ID作爲參數傳遞給某個方法,並且希望將其作爲事前條件的一部分進行檢查,則可以輸入IllegalArgumentExceptionRuntimeException
IndexOutOfBounds沒有意義,因爲它在這裏很混亂。這是當你做一個訪問越界

+0

ID作爲參數傳遞。比我做一些東西,看看它是否在集合中,如果不是我拋出異常。現在,我認爲只有在執行函數之前,我明確知道什麼值不允許爲null之類的情況下,我纔可以拋出該異常。所以在我的情況下,我可能無法使用它。 – lunar

0

取決於上下文,但是IMO如果要查找ID,這個概念不與位置參考綁定,這可能是特定應用異常–的濫用,也可能是特定於應用的ItemNotFound或等價物。

如果您的API有一個合約,指定您要麼返回一個有效的對象,要麼拋出一個異常,然後拋出異常。如果有意義,也可以考慮使用NullObject模式。

0

如果調用工程23和呼叫工程47,並沒有在此期間改變,那麼它不會爲35工作原因不能是一個指數是出界。

1

就我個人而言,我會拋出一個檢查異常,所以調用方法被迫抓住它。你可以做的是叫

initCause 

異常,並設置這是拋出:IllegalArgumentException

例如

public method(int i) throws MyException { 
    if (i < 0) { 
     MyException e = new MyException(); 
     e.initCause(new IllegalArugmentException()); 
     throw e; 
    } 
} 

我可能還調用正確的corectors的消息傳遞給當拋出異常,清楚發生了什麼事情。