В настоящее время я программирую многопользовательскую игру на 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 является пустой ArrayList из "игры" внутри Lobby.java. Игры дополняются другими функциями.
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();
}
}
}
Извините за размытости. Если вам нужен еще один код, я обязательно добавлю его. Благодаря!
Вы можете изменить объект, только если вы используете итератор. –
1st, я уже пробовал использовать итератор. Во-вторых, я ничего не изменяю без функций, которые используют Итераторы. – anonmous
'Lobby.removeGame (g);' предполагает, что вы пытаетесь манипулировать 'Lobby.games' в цикле. – njzk2