Java Collections API Bug?

Hum*_*art 3 java collections

我偶然发现了Collections.java中Java Collections API中的一个错误.

以下是JDK源代码中的代码.您知道,JavaDoc版本标记为"1.106,04/21/06".该方法位于第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;
}
Run Code Online (Sandbox Code Playgroud)

如果您花一点时间来分析该方法,您将很快发现错误:T candidate = i.next().D'哦!在迭代器上调用i.next()而不首先检查hasNext()?那只是要求一个例外.

当然在编码过程中应该发现类似的东西?这意味着使用API​​必须检查集合是否至少包含两个元素.

Jon*_*eet 21

不 - 这意味着尝试查找空集合的最大元素是无效的.这在API文档中指定:

Throws:
    NoSuchElementException - if the collection is empty.
Run Code Online (Sandbox Code Playgroud)

Iterator.next()如果没有下一个元素,这就是要记录的内容,因此它正在完成它的意图.

请注意,第一次调用next()之后,调用hasNext()来检查是否存在多个元素.

  • 来吧,这不是你的睡前时光吗?我正在说同样的事情. (2认同)

Ste*_*eed 7

很难将其称为错误,因为此处记录了异常

抛出:

  • ClassCastException如果集合包含不可相互比较的元素(例如,字符串和整数).
  • 如果集合为空,则为NoSuchElementException.