gpt4 book ai didi

java - [Java]并发修改异常;迭代器不起作用

转载 作者:行者123 更新时间:2023-11-30 03:23:20 25 4
gpt4 key购买 nike

在编写一个简单的游戏时,我遇到了并发修改异常,所以我查看了这里,发现了两种不同的方法来修复它。它起作用了,但是,由于未知的原因,只有当玩家调用该函数时才起作用,而当人工智能玩家调用(相同的)函数时则不起作用。

该函数的 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 Manoharan 要求的 runGame() 方法,这里是:

public void runGame() {
for(Enemy enemy : enemys) {
enemy.eat(enemys);
enemy.update();
}
player.eat(enemys);
player.update();
}

最佳答案

可能的修复...

public List 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);
}
}
}
}

return toRemove;
}

public void runGame() {
for(Enemy enemy : enemys) {
List eaten = enemy.eat(enemys);
enemy.update();
}
enemys.removeAll(eaten);
player.eat(enemys);
player.update();
}

关于java - [Java]并发修改异常;迭代器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30807768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com