gpt4 book ai didi

java - 移除对象会导致卡住

转载 作者:行者123 更新时间:2023-12-01 17:58:08 24 4
gpt4 key购买 nike

[为了澄清,“怪物”是一个 NPC 列表,当被物体“子弹”射击时,这些 NPC 会从列表中删除。]

启动时出错:

W/System.err: java.util.ConcurrentModificationException
W/System.err: at java.util.ArrayList$Itr.next(ArrayList.java:831)
W/System.err: at com.companyname.product.GameplayScene.update(GameplayScene.java:113)
//...

我相信这意味着它正在尝试对列表中不存在的内容执行操作。所以我的问题是我能否获得一些帮助来确定调用不存在的对象的点,因为我似乎找不到它。我知道它属于哪个类,因为第一行针对每个错误都会引用它。

        for (Bullet bullet : player.getList())
if (npcManager.bulletCollide(bullet)) { //checks for a collision between all npcs and all bullets
player.getList().remove(bullet);//npc is removed in method above

}

if (!gameOver) {
npcManager.update(); //updates movement of npcs
if (npcManager.playerCollideNPC(player)) {
//end game
}
}

for (RectNPC NPC : npcManager.getList())
if (obstacleManager.NPCCollide(NPC)) { //checks collision between npcs and other objects
//
}

int i = 0;
//checks collisions between NPCs themselves
while (i < (Constants.NUMBER_ENEMIES - 1)) {
if (npcManager.getList().size() <= 1)
return;
if (Rect.intersects(npcManager.getList().get(i).getRectangle(), npcManager.getList().get(i + 1).getRectangle()))
npcManager.getList().get(i).setRectangle(200);
i += 1;
}
}

(上图)我想问题出在调用更新中的某些内容(如上所示),其中该对象不再可用,我删除 NPC 的方式是否存在问题?

 public boolean bulletCollide(Bullet bullet) {
for(RectNPC npc : monsters) {
if(npc.bulletCollideNPC(bullet)) {
monsters.remove(npc);
monsters.add(0, new RectNPC(new Rect(100, 100, 200, 200), Color.rgb(255, 0, 0), 25));
return true;
}
}
return false;
}

(上图)我删除 NPC 的代码,我已将其包含在内,以防它有帮助 - 但它确实达到了预期目的,所以我不认为这是问题所在。

<小时/>

我的主要问题是,这里有什么东西会导致这个错误(游戏停止几帧并在顶部给出错误) - 或者是否有什么东西/其他地方我应该特别注意?另外我知道我的一些语法不太好,很抱歉这是我的第一个 Java 项目。

<小时/>

当前迭代器:

for(Iterator<RectNPC> iterator = monsters.iterator(); iterator.hasNext();) {
if(iterator.next().bulletCollideNPC(bullet)) {
iterator.remove();
monsters.add(0, new RectNPC(new Rect(100, 100, 200, 200), Color.rgb(255, 0, 0), 25));
return true;
}
}

for (Iterator<Bullet> iterator = player.getList().iterator(); iterator.hasNext(); ) {
if (npcManager.bulletCollide(iterator.next())) {
iterator.remove();
//
}
}

最佳答案

在java中,你不能这样做for(Tvariable:collection){collection.remove(variable); } 换句话说,您无法从使用 for 循环迭代的集合中删除项目。它将导致 ConcurrentModificationException。 Google 搜索“java failure-fast iterator”,了解有关原因和方式的更多信息。

您有两个选择:

  • 将所有要删除的怪物收集到临时列表中,然后在完成对主列表的迭代后,再次迭代临时列表以将它们从主列表中删除。关键是您不会从正在迭代的同一个列表中删除。

  • 不要使用“foreach”(for) 循环,而是使用实际的迭代器,当您想要删除某个项目时,可以通过调用迭代器的 remove() 来删除它 方法,不是包含集合的 remove() 方法。迭代器的 remove() 方法执行必要的技巧来防止抛出 ConcurrentModificationException

关于java - 移除对象会导致卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43080875/

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