2009-04-17 10 views
3

Java Collections API、Collections.javaのバグに遭遇しました。Java Collections APIバグ?

ここでは、JDKのソースコードをそのまま使用しています。 JavaDocのバージョンタグは「1.106、04/21/06」となっています。 )T候補= i.next(:メソッドは、あなたが方法を分析するために第二を取る場合、あなたはすぐにバグを発見ますライン638

public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) { 
    Iterator<? extends T> i = coll.iterator(); 
    T candidate = i.next(); 

    while (i.hasNext()) { 
     T next = i.next(); 
     if (next.compareTo(candidate) > 0) 
      candidate = next; 
    } 
    return candidate; 
} 

に位置しています。 D'oh!最初にhasNext()をチェックせずにIteratorでi.next()を呼び出しますか?それは単に例外を求めているだけです。

確かに、コーディング中に見つかったはずのものがありますか?つまり、APIを使用すると、コレクションに少なくとも2つの要素があるかどうかを確認する必要があります。

+1

"これは、コレクションに少なくとも2つの要素があるかどうかをAPIで確認する必要があることを意味します。 - 実際には、コレクションが空であるかどうか最初にチェックする必要があるということです。これは、next()が例外をスローする唯一のケースです。 –

答えて

21

いいえ - 空のコレクションの最大要素を見つけることができないことを意味します。これは、APIドキュメントで指定されています

なし次の要素がない場合はスローするように文書化されているので、それが意味です正確に何をして何 Iterator.next()
Throws: 
    NoSuchElementException - if the collection is empty. 

)(次へ 後の最初の呼び出しは、のhasNextへの呼び出しがあること

注()以上よりも一つの要素がありますかどうかを確認します。

+2

さて、あなたの就寝時間はまだですか?私は同じことを言っている途中であった。 –

+0

確実に1要素コレクションの場合、正しい操作はその要素を返すべきであり、例外をスローしないことです。 –

+0

その要素を返します。 – erickson

7

例外が文書化されているので、here

例外バグそれを呼び出すようにハード:

  • ClassCastExceptionが、コレクションは、(例えば、文字列と整数)相互に比較可能でない要素が含まれている場合。
  • NoSuchElementExceptionコレクションが空の場合。
2

API docCollection.max方法によれば、コレクションが空の場合NoSuchElementExceptionをスローします。

これはまさにあなたが観察したものです。