我有一个空白,当它被调用时,它会发送一个并发修改异常。我无法理解为什么我会继续得到它,即使我没有看到任何同时进行的修改。
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();
}
答案 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);
}