Ошибка API коллекций Java?

Я наткнулся на ошибку в API коллекций Java, в Collections.java.

Вот дословный код из источника JDK. Просто чтобы вы знали, тег версии JavaDoc читается как «1.106, 21.04.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;
}

Если вы потратите секунду на анализ метода, вы быстро обнаружите ошибку: T-кандидат = i.next(). О! Вызов i.next() на итераторе без предварительной проверки hasNext()? Это просто просьба об исключении.

Наверняка что-то подобное должно было быть замечено во время кодирования? Это означает, что использование API должно проверять наличие в коллекции по крайней мере двух элементов.


person Humphrey Bogart    schedule 17.04.2009    source источник
comment
Это означает, что использование API должно проверять наличие в коллекции по крайней мере двух элементов. -- На самом деле, это просто означает, что вы должны сначала проверить, пуста ли ваша коллекция. Это единственный случай, когда next() вызовет исключение.   -  person Michael Myers    schedule 18.04.2009


Ответы (3)


Нет - это означает, что нельзя пытаться найти максимальный элемент пустой коллекции. Это указано в документах API:

Throws:
    NoSuchElementException - if the collection is empty.

Это то, что Iterator.next() задокументировано для выбрасывания, если нет следующего элемента, поэтому он делает именно то, для чего предназначен.

Обратите внимание, что после первого вызова next() следует вызов hasNext() для проверки наличия большего элемента.

person Jon Skeet    schedule 17.04.2009
comment
Давай, тебе еще не пора спать? Я как раз собирался сказать то же самое. - person Michael Myers; 18.04.2009
comment
конечно, для одноэлементной коллекции правильная операция заключается в том, что она должна возвращать этот элемент, а не генерировать исключение. - person Humphrey Bogart; 18.04.2009
comment
c'est vrais. я пропустил блок while; что-то еще вызвало исключение, которое я предполагаю. - person Humphrey Bogart; 18.04.2009
comment
@Steve Reed Вы не ровня этим 32-летнему - женаты и отцу 3 - сотруднику Google - писателю книг C # из Рединга, Великобритания. - person Tom; 18.04.2009

Трудно назвать это ошибкой, так как исключение задокументировано здесь

Броски:

  • ClassCastException, если коллекция содержит элементы, которые не являются взаимно сопоставимыми (например, строки и целые числа).
  • NoSuchElementException, если коллекция пуста.
person Steve Reed    schedule 17.04.2009

Согласно документу API Collection.max выдает NoSuchElementException, если коллекция пуста.

Это именно то, что вы наблюдали.

person topchef    schedule 17.04.2009