Почему я получаю IllegalStateException
в iterator.remove()
, если я звонил iterator.next()
до этого?
Есть ли какая-либо возможная причина для этого? iterator.next()
метод был вызван ранее, а iterator.remove()
не был вызван дважды. Я не могу думать ни о какой другой причине для IllegalStateException
. Этот код выполняется в рабочем потоке SimpleThreadPool Quartz Timer (все в моем веб-приложении, работающем на Tomcat7), но это не имеет значения?
Пожалуйста, смотрите смело прокомментированные части кода ниже для упрощения описания проблемы (это из реального проекта).
public Set<Draw5x36> shortListByFiveDistancePattern(Set<Draw5x36> candidatesToShortlist,
int DEPTH_TO_CHECK_UNIQUENESS_OF_DISTANCE_PATTERN) {
Set<Draw5x36> candidatesToShortlistCopy = new HashSet<>(candidatesToShortlist);
FiveDistancePatternAnalyzer analyzer = new FiveDistancePatternAnalyzer(allDraws);
// GET ITERATOR FROM A SET
Iterator<Draw5x36> candidatesIterator = candidatesToShortlistCopy.iterator();
// CHECK iterator.hasNext() WITHIN LOOP
while (candidatesIterator.hasNext()) {
// CALL iterator.next() - WITHIN METHOD ARGUMENT WITHIN IF CONDITION BELOW
if (!analyzer.isFiveDistancesUniqInNLatestDrawsFromCandidate(candidatesIterator.next(),
DEPTH_TO_CHECK_UNIQUENESS_OF_DISTANCE_PATTERN)) {
// GET IllegalStateException, BUT I CALLED iterator.next() above!
candidatesIterator.remove();
}
}
return candidatesToShortlistCopy;
}
Аргумент метода должен быть оценен перед вызовом метода, и метод внутри условия if на 100% вызывается для оценки условия if, поэтому всегда вызывается iterator.next()
.