2010-09-27 57 views
16

我有一個函數來計算作爲參數傳遞的列表的平均值。我想知道當我嘗試計算大小爲0的列表的平均值時應拋出哪個Java異常。扔什麼異常?

public double mean (MyLinkedList<? extends Number> list) 
{ 
    if (list.isEmpty()) 
     throw new ????????; //If I am not mistaken Java has some defined exception for this case 

    //code goes here 
} 

謝謝。

回答

25

你可以拋出一個new IllegalArgumentException()

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

只是不要忘記傳遞一個明確的消息作爲第一個參數。這真的會幫助你理解發生了什麼。

例如「不能在空列表上使用平均值」。

+0

嗯,我想找出哪些異常處理的最好方法就是破壞你的程序並讓java編譯器告訴你..不是嗎 – 2016-11-11 16:43:34

3

您應該創建一個擴展異常的新類,並提供特定於您的錯誤的詳細信息。例如,您可以創建一個名爲EmptyListException的類,其中包含有關您的錯誤的詳細信息。這個可能是是一個非常簡單的異常類,它不需要構造函數參數,但可能調用super("Cannot generate mean for an empty list");來向堆棧跟蹤提供自定義消息。

很多時候這個做得不夠好......我最討厭的代碼氣味之一是開發人員使用泛型異常(甚至有時候是Exception本身),並將字符串消息傳遞給構造函數。這樣做是有效的,但是讓那些實現你的代碼的人的工作變得更加困難,因爲當真的只有一些事情可能發生時,他們必須捕獲一個通用的異常。例外應與您用於數據的對象具有相同的層次結構,每個級別都提供更具體的細節。異常類越詳細,堆棧跟蹤越詳細和有用。

我發現這個網站:Exceptional Strategies在爲我的應用程序創建例外時非常有用。

1

ArithmeticException - 與運行時拋出一樣。

2

NoSuchElementException。雖然IllegalArgumentException可能會更好。

1

您目前是否正在拋出其他異常(或計劃?)前面提到的任何異常都沒問題,或者只是創建自己的異常。最重要的是傳播錯誤信息。

如果有機會,異常的'捕手'可能會重新拋出它,比你可能想要調查任何其他異常'捕手'也可能拋出。

7

首先問自己的問題是,你是否應該拋出一切,然後,如果是的話,應該是檢查還是非檢查的例外。

遺憾的是,在決定這些事情沒有行業的最佳實踐,如通過這個StackOverflow的答案:

In Java, when should I create a checked exception, and when should it be a runtime exception?

不過,也有一些關鍵的考慮因素:

  • 您的設計/對於這種方法應該如何工作的願景(對於用0大小的列表調用該方法是否合理/正常)?

  • 一致性與類/包

  • 符合您的應用編碼標準等的方法(如果有的話)

我的看法:

  • 返回Double.NAN或0如果調用0大小列表的方法是合理的/預期的/正常的,我會con如果0適用於您的問題域,則返回Double.NAN0

  • 拋出一個IllegalArgumentException如果我的設計說,檢查空List強烈呼叫者和方法的文檔的責任是要明確規定,這是調用者的責任,那麼我d使用標準的未檢查IllegalArgumentException

  • 拋出一個自定義的檢查異常如果方法是統計數據包或庫的一部分,其中一些統計功能需要處理一個可能的空數據集,我覺得這是一部分的異常情況問題領域。我會創建一個自定義(可能是checked)的異常(例如EmptyDataSetException)作爲類/包/庫的一部分,並在所有適用的方法中使用它。使其成爲檢查異常有助於提醒客戶考慮如何處理該情況。

1

我不相信你應該拋出一個例外;如果你願意,「無」的平均值是「無」或0。如果這個集合是空的,你應該簡單地返回0.

如果你真的必須拋出一個異常,那麼IllegalStateException或IllegalArgumentException是你的最佳選擇。