현재 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>();
업데이트 : 모호한 것에 대한
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();
}
}
}
죄송합니다 : 그리고 이것은 removeGame입니다. 더 많은 코드가 필요하다면 반드시 추가 할 것입니다. 감사!
반복자를 사용하는 경우에만 개체를 변경할 수 있습니다. –
첫째, 이미 반복기를 사용해 보았습니다. 둘째, 반복자를 사용하는 함수가없는 것은 수정하지 않습니다. – anonmous
'Lobby.removeGame (g);'은 루프에서'Lobby.games'를 조작하고 있음을 나타냅니다. – njzk2