При программировании простой игры я пришел на исключение параллельной модификации, поэтому я посмотрел здесь и нашел два разных способа исправить это. Он работал, но, по неизвестным причинам, только тогда, когда игрок вызывает функцию, а не если AI игроки называют (ту же) функцию.[Java] Исправление одновременной модификации; Итератор не работает
версии 1.0 функции выглядит следующим образом:
public void eat(ArrayList<Enemy> enemys) {
ArrayList<Enemy> toRemove = new ArrayList<Enemy>();
for(Enemy enemy : enemys) {
if(enemy.location.x != location.x && enemy.location.y != location.y) { //check for self
if(collidesWith(enemy)) {
if(width > enemy.width) {
width += enemy.width;
height = width;
toRemove.add(enemy);
}
}
}
}
enemys.removeAll(toRemove);
}
как это не сработало, я попробовал трюк с итератора, который, к сожалению, производит точно такую же ошибку:
public void eat(ArrayList<Enemy> enemys) {
for(Iterator<Enemy> iterator = enemys.iterator(); iterator.hasNext();) {
Enemy enemy = iterator.next();
if(enemy.location.x != location.x && enemy.location.y != location.y) { //check for self
if(collidesWith(enemy)) {
if(width > enemy.width) {
width += enemy.width;
height = width;
iterator.remove(); //remove the enemy
}
}
}
}
}
сообщение об ошибке:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at Main.runGame(Main.java:59)
at Main.<init>(Main.java:43)
at Main.main(Main.java:68)
заранее спасибо
-v0xelDev
EDIT: в качестве Abishek Манохаран попросил runGame() метод, здесь это:
public void runGame() {
for(Enemy enemy : enemys) {
enemy.eat(enemys);
enemy.update();
}
player.eat(enemys);
player.update();
}
Вы используете более одного потока? – assylias
@assylias в настоящее время, нет – v0xelDev
Как вы относите ошибку к методу 'eat()', но этот метод не отображается в вашей трассировке стека? –