Je rencontre des problèmes avec une exception de modification simultanée. J'ai changé mon code pour utiliser les itérateurs, mais je rencontre toujours ces problèmes lorsque je supprime un objet. Mon erreur se produit sur la ligneException de modification simultanée avec des objets
theEnemy = (Enemy) EnemyItr.next();
Je ne sais pas comment je contourner ce qu'il est une partie très importante du code.
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;
}
}
L'exception est assez explicite: vous ne pouvez pas modifier une collection à travers laquelle vous itérez. Vous faites cela lorsque vous supprimez l'ennemi de la liste. (Et ne pas attraper des exceptions comme ça, ils vous disent que quelque chose ne va pas avec votre code que vous devez corriger.) – dlev
@dlev Oui, je comprends cela, mais je ne vois pas comment le réparer, je ne peux pas juste supprimer le code qui définit l'objet suivant. –
Vous devez utiliser un mécanisme différent pour itérer votre collection dans ce cas. Vous pouvez également créer une copie de la collection, l'itérer et supprimer l'objet de la liste d'origine. – dlev