我目前正在用Java编程多人游戏。我目前的代码(即得到错误)是如此。ConcurrentModificationException,但没有修改
@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的空ArrayList。通过其他功能添加游戏。
public static ArrayList<Game> games = new ArrayList<Game>();
UPDATE:这是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();
}
}
}
对不起,含糊其辞。如果你需要更多的代码,我肯定会添加它。谢谢!
如果您使用迭代器,则只能更改对象。 – 2014-10-01 02:49:02
1,我已经尝试过使用迭代器。其次,我不修改任何没有使用迭代器的函数。 – anonmous 2014-10-01 02:50:29
'Lobby.removeGame(g);'表示您在循环中篡改'Lobby.games'。 – njzk2 2014-10-01 02:56:40