編寫一個簡單的遊戲時,我遇到了一個併發修改異常,所以我查看了這裏,發現了兩種不同的方法來修復它。它起作用了,但是,由於未知的原因,只有當玩家調用該函數時,而不是在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
編輯:作爲Abishek馬諾哈蘭要求的runGame()方法,那就是:
public void runGame() {
for(Enemy enemy : enemys) {
enemy.eat(enemys);
enemy.update();
}
player.eat(enemys);
player.update();
}
是否使用多個線程? – assylias
@assylias當前沒有 – v0xelDev
它是如何將錯誤歸入方法'eat()',但該方法不會出現在您的堆棧跟蹤中? –