Я делаю 2D-java-игру, основанную на Space Invaders. В моем классе Game У меня есть эти 3 поля:Ошибка Java-игры при обнаружении столкновений с LinkedList
//enemies left to kill
private LinkedList<Enemy> enemiesLeft = new LinkedList<Enemy>();
//enemies killed
private LinkedList<Enemy> enemiesKilled = new LinkedList<Enemy>();
//missiles that have been fired
private LinkedList<Missile> missiles = new LinkedList<Missile>();
В моем checkCollision()
методе я бегу через каждый Enemy
в enemiesLeft
списке и проверьте столкновения с каждым Missile
missiles
в списке, но он бросает ConcurrentModificationException
.
Вот checkCollision()
метод:
private void checkCollisions(){
//make an iterator over enemies
ListIterator<Enemy> iterEnemies = enemiesLeft.listIterator();
//loop through enemies
while(iterEnemies.hasNext()){
//error is thrown at below line
Enemy e = iterEnemies.next(); //current Enemy
//go through each Missile
ListIterator<Missile> iterMissiles = missiles.listIterator();
while(iterMissiles.hasNext()){
Missile m = iterMissiles.next(); //current Missile
if(e.doesIntersect(m)){
//remove Enemy from enemiesLeft and add it to enemiesKilled list
enemiesKilled.add(enemiesLeft.remove(enemiesLeft.indexOf(e)));
//remove Missile
missiles.remove(m);
}
}
}
updateScore();
}
И это ошибка я получаю:
java.util.ConcurrentModificationException
at java.util.LinkedList$ListItr.checkForComodification(Unknown Source)
at java.util.LinkedList$ListItr.next(Unknown Source)
at Game.checkCollisions(Game.java:168)
at Game.run(Game.java:197)
at Game.main(Game.java:279)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
Игра проходит гладко, пока не произойдет столкновение. Пожалуйста, помогите мне!
Смотреть это вопрос об [избегая ConcurrentModificationException] (http: // stackoverflow.com/questions/223918/iterating-through-a-list-avoiding-concurrentmodificationexception-when-remove) для обсуждения ** почему ** это происходит, а также некоторые варианты решения этой проблемы. –