我目前正在用 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/