Краткий ответ:
Для каждого вызова hasNext () должен быть только один вызов next ()
В вашем коде у вас есть 5 next () только с одним hasNext ()
Вот, прочитайте это: http://java.sun.com/javase/6/docs/api/java/util/Iterator.html
РЕДАКТИРОВАТЬ
Более длинный ответ:
По существу, итератор используется для ... итерации элементов "чего-то", как правило, коллекции, но это может быть что угодно (при условии, что что-либо возвращает итератор).
Поскольку вы, возможно, не знаете, сколько элементов имеет это "что-либо", должен быть способ прекратить итерацию, верно? (если это был массив, вы можете определить это по свойству length, но итератор используется для «инкапсуляции» структуры данных, используемой в реализации). В любом случае.
Итератор API определяет эти два метода
-hasNext(): boolean
-next(): Object ( or <E> since Java 1.5 )
Итак, типичная идиома такая:
while( iterator.hasNext() ) { // reads: while the iterator has next element
Object o = iterator.next(); // give me that element
}
Что произойдет, если итератор имеет только два элемента?
while( iterator.hasNext() ) { // the first time will return true, so the next line will be executed.
Object o = iterator.next(); // give me that item. ( 1st element )
Object b = iterator.next(); // oops dangerous by may work ... ( 2nd element )
Object c = iterator.next(); // eeeerhhh... disaster: NoSuchElementException is thrown.
}
Это то, что происходит с вами. Вы не проверяли, есть ли у итератора другой элемент, вы просто извлекаете его. Если в итераторе есть некоторые элементы, он может работать некоторое время, но будет время (как вы только что видели), когда он потерпит неудачу.
Кстати, НЕ даже и не думает поймать NoSuchElementException. Это исключение времени выполнения, и оно указывает, что что-то в логике вашего кода должно быть исправлено.
См. этот ответ , чтобы узнать больше об исключениях.