[为澄清起见,“怪物”是一个 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();
//
}
}