java - ConcurrentModificationException,但没有修改

标签 java concurrentmodification

我目前正在用 Java 编写多人游戏。我当前的代码(即出现错误)是这样的。

@Override
public void onClose(WebSocket conn, int code, String reason, boolean remote){
    System.out.println("Socket disconnected.");

    for(Game g : Lobby.games){
        if(g.hasPlayer(new Player(conn))){
            Player ourPlayer = null;

            for(Player p : g.getPlayers()){
                if(p.getSocket() == conn){
                    ourPlayer = p;
                    break;
                }
            }

            if(ourPlayer == null) return;

            g.removePlayer(ourPlayer);

            for(Player p : g.getPlayers()){
                send(p.getSocket(), Messages.SEND_REMOVE_PLAYER + ourPlayer.getName());
            }

            if(g.getPlayers().size() == 0){
                Lobby.removeGame(g);
            }
        }
    }
}

现在请不要询问像 onClose 这样的函数。这并不是造成问题的原因。

我收到以下行的 ConcurrentModificationException:

for(Game g : Lobby.games){

Lobby.games 是 Lobby.java 中“Game”的空 ArrayList。通过其他功能添加游戏。

public static ArrayList<Game> games = new ArrayList<Game>();

更新:这是removeGame:

public static void removeGame(Game game){
    Iterator<Game> itr = games.iterator();

    while(itr.hasNext()){
        Game g = itr.next();

        if(g.getId() == game.getId()){
            System.out.println("Game "+g.getId()+" removed");
            itr.remove();
        }
    }
}

抱歉说得含糊。如果您需要更多代码,我一定会添加它。谢谢!

最佳答案

你的问题(几乎肯定)在这里:

for(Game g : Lobby.games) {
    // other code
    if (g.getPlayers().size() == 0){
        Lobby.removeGame(g);
    }
}

如果Lobby.removeGame(g)更改了Lobby.games的内容,那么您将在迭代时修改Lobby.games它(foreach 循环隐式迭代 Lobby.games)。

要么使用迭代器并调用Iterator.remove(),要么保存要在循环后删除的游戏集合,或者重新组织代码以避免这种情况。

关于java - ConcurrentModificationException,但没有修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26133363/

相关文章:

java - 如何使用 Java 获取 Sonic 管理控制台容器日志时间戳?

java - 用于搜索(不同)整数 Java 的数据结构

java - 仅修改 Hashmap 值时的并发修改异常

java - 使用流时出现 ConcurrentModificationException

java - 即使我没有编辑任何内容,为什么也会收到 ConcurrentModificationException?

android - 使用 mylocation 覆盖和计时器的 ConcurrentModificationException

java - vaadin表容器并发修改

java - 通过 RESTful Web 服务编辑对象

java - 具有 HMAC key 生成的算法

java - 为什么我不能访问这个循环之外的数组