Ошибка API Коллекций Java? - PullRequest
3 голосов
/ 18 апреля 2009

Я наткнулся на ошибку в 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 () D'о! Вызов i.next () для Итератора без предварительной проверки hasNext ()? Это просто просьба об исключении.

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

Ответы [ 3 ]

21 голосов
/ 18 апреля 2009

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

Throws:
    NoSuchElementException - if the collection is empty.

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

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

7 голосов
/ 18 апреля 2009

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

Выдает:

  • ClassCastException, если коллекция содержит элементы, которые не являются взаимно сопоставимыми (например, строки и целые числа).
  • NoSuchElementException, если коллекция пуста.
2 голосов
/ 18 апреля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...