-1

我有一个 void,当它被调用时,它会发送一个并发修改异常。我不明白为什么我一直得到它,即使我没有看到正在执行任何并发修改。

public static void destroyPlayingGame() {
    for (CastleWarBarricade npc : playingGame.barricades) {
         playingGame.removeBarricade(CastleWars.SARADOMIN, npc);
         playingGame.removeBarricade(CastleWars.ZAMORAK, npc);
    }
    for (WorldObject object : playingGame.spawnedObjects)
        World.destroySpawnedObject(object, false);
    for (CastleWarBarricade npc : playingGame.barricades)
        npc.finish();

    playingGame.spawnedObjects.clear();
    playingGame.barricades.clear();
    playingGame.cancel();
    playingGame = null;
    refreshAllPlayersTime();
    leavePlayersSafely();
}
4

2 回答 2

2

并发修改必须发生在循环中的方法调用之一中。例如,可以从集合removeBarricade中移除npc对象。playingGame.barricades这是一个并发修改。

那我该怎么做呢?

更改removeBarricade使其不会从集合中删除对象,然后改为执行以下操作:

for (Iterator<CastleWarBarricade> it = playingGame.barricades.iterator();
     it.hasNext(); ) {
     CastleWarBarricade npc = it.next();
     if (playingGame.removeBarricade(CastleWars.SARADOMIN, npc) ||
         playingGame.removeBarricade(CastleWars.ZAMORAK, npc)) {
         it.remove();
     }
}

或者,构建要删除的东西的集合,并removeAll在循环结束后通过调用删除它们!

于 2013-04-07T01:24:27.557 回答
1

基本上,您不能在 for-each 语句中修改 Collection

for (CastleWarBarricade npc : playingGame.barricades) {...}

在上述声明中修改您的游戏收藏是非法的

更新

您可以有多种选择。

你可以使用for-next循环...

for (int index = 0; index < playingGame.barricades.size(); index++) {
    CastleWarBarricade npc = playingGame.barricades.get(index);
    playingGame.removeBarricade(CastleWars.SARADOMIN, npc);
    playingGame.removeBarricade(CastleWars.ZAMORAK, npc);
}

您可以将原始集合转换为数组并使用for-each

CastleWarBarricade[] values = playingGame.barricades.toArray(new CastleWarBarricade[playingGame.barricades.size]);
for (CastleWarBarricade npc : values) {
    playingGame.removeBarricade(CastleWars.SARADOMIN, npc);
    playingGame.removeBarricade(CastleWars.ZAMORAK, npc);
}
于 2013-04-07T01:21:32.913 回答