У меня возникла проблема с исключением параллельной модификации. Я изменил свой код, чтобы использовать итераторы, но я все еще получаю эти проблемы при удалении объекта. Моя ошибка возникает на линииИсключение с одновременным изменением с объектами
theEnemy = (Enemy) EnemyItr.next();
Я не знаю, как я бы обойти эту проблему, так как это очень важная часть кода.
for (Iterator EnemyItr = activeEnemies.iterator(); EnemyItr.hasNext();){
theEnemy = (Enemy) EnemyItr.next();
try {
try {
if (theEnemy.x < 0 && theEnemy.y >= 5) {
activeEnemies.remove(theEnemy);
}
} catch (Exception e) {
System.err.println("Cannot Remove Enemy");
}
Enemy.pathFind(Enemy.getXBlockOfEnemy(theEnemy.x), Enemy.getXBlockOfEnemy(theEnemy.y), theEnemy.x, theEnemy.y);
if (Enemy.right) {
theEnemy.x += Enemy.speed;
//System.out.println("right");
//System.out.println(theEnemy.x + " " + theEnemy.y);
} else if (Enemy.down) {
theEnemy.y += Enemy.speed;
//System.out.println("down");
//System.out.println(theEnemy.x + " " + theEnemy.y);;
} else if (Enemy.up) {
theEnemy.y -= Enemy.speed;
//System.out.println("up");
//System.out.println(theEnemy.x + " " + theEnemy.y);
} else if (Enemy.left) {
theEnemy.x -= Enemy.speed;
//System.out.println("left");
//System.out.println(theEnemy.x + " " + theEnemy.y);
} else {
System.out.println("Enemy Lost.");
//System.out.println(theEnemy.x + " " + theEnemy.y);
}
g.drawImage(enemy, theEnemy.x, theEnemy.y, this);
//System.out.println(Enemy.getXBlockOfEnemy(theEnemy.x));
//drawing health bar
if (Input.displayUI) {
g.setColor(Color.LIGHT_GRAY);
g.fillRect(theEnemy.x, theEnemy.y - 10, 70, 10);
g.setColor(Color.RED);
g.fillRect(theEnemy.x + 2, theEnemy.y - 10 + 1, 68, 8);
g.setColor(Color.GREEN);
g.fillRect(theEnemy.x + 2, theEnemy.y - 10 + 1, (int) (.68 * theEnemy.enemylife), 8);
}
} catch (ConcurrentModificationException e) {
theEnemy = null;
}
}
Исключением является довольно очевидно: вы не можете изменять коллекцию, через которую вы итерация. Вы делаете это, когда вы удаляете врага из списка. (И не просто поймайте такие исключения, они сообщают вам, что что-то не так с вашим кодом, который вам нужно исправить.) – dlev
@dlev Да, я это понимаю, но я не понимаю, как это исправить, я не могу просто удалите код, который устанавливает следующий объект. –
В этом случае вам необходимо использовать другой механизм для повторной обработки вашей коллекции. Или создайте копию коллекции, повторите ее и удалите объект из исходного списка. – dlev