В настоящее время я работаю над проектом класса типа Software Engineering и запускаю то, что я вижу как странную ошибку. Согласно исследованию/отладке, что я сделал Java ConcurrentModificationException обычно генерируется, когда HashMap модифицируется к тому времени, когда вызывается его метод next().Исключение одновременной модификации Несмотря на то, что HashMap восстанавливается до исходного состояния?
Чтобы дать вам представление о проблемном домене, это шахматная игра, в которой я определяю мат. В настоящее время мой код структурирована следующим образом:
- Получить все ключи HashMap (доска)
- для (Координировать ключевые: ключи) ...
- Move Кусок обнаружить на борту
- Проверьте король находится под атакой
- Move штучных назад
- Loop
Этот раздел кода генерирует ConcurrentModificationException при циклизации, несмотря на то, что HashMap находится в том же состоянии, в котором он начинался, когда начиналась итерация - размер и точные значения.
Любые идеи, что может вызвать это?
Loop:
for(ValidatorCoordinate key: keys){
if(board.findPiece(key).getPieceType() != XiangqiPieceType.GENERAL
&& moveValid(key, spaceBetween, color)
&& tryBlock(key, spaceBetween, dst, color)){
return true;
}
}
tryBlock() (метод, где Модифицированный HashMap)
private boolean tryBlock(ValidatorCoordinate source,
ValidatorCoordinate destination,
ValidatorCoordinate underAttack, XiangqiColor c){
board.movePiece(source, destination, c);
boolean blocked = !underAttack(underAttack, c);
board.movePiece(destination, source, c);
return blocked;
}
movePiece() метод определенно перемещает куски в HashMap (тщательно протестированы в этой точке)
Любая помощь была бы принята с благодарностью.
Спасибо!
Редактировать: Для пояснения этот общий подход работал до тех пор, пока я не отвлек движение до другого метода (tryBlock). Ранее содержимое цикла tryBlock находилось внутри цикла, и исключение не было выбрано. Вот почему я беспокоюсь об этом, так как для меня это тоже должно было исключить исключение.
Любая модификация отклоняется 'HashMap', даже если она заканчивается возвратом в исходное состояние. (По уважительной причине, даже если содержимое карты одинаково, внутреннее расположение хэш-кодов может отличаться.) –
Просто, чтобы уточнить, есть ли причина, по которой это исключение не будет выбрано до тех пор, пока не зациклится? Модификация технически разрешена, но петля жалуется. Кроме того, этот же подход работал ранее, однако перемещение части не было абстрагировано от другого метода в этот момент. Эта ошибка появилась только при рефакторинге. Спасибо! – bwbonanno
Методы «Итераторы», как правило, те, что вызывают исключение ConcurrentModificationException. Методы модификации не знают, что итерация продолжается. –