我的代码创建了并发修改异常

时间:2013-04-07 01:17:32

标签: java exception concurrency

我有一个空白,当它被调用时,它会发送一个并发修改异常。我无法理解为什么我会继续得到它,即使我没有看到任何同时进行的修改。

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();
}

2 个答案:

答案 0 :(得分: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调用删除它们!

答案 1 :(得分:1)

基本上,您无法在for-each语句中修改Collection

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

在上述声明中修改playGame集合是非法的

<强>更新

你可以做出多种选择。

您可以使用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);
}