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