I'm making a 4-player team game and was asked to use a sublist. Here are the lists:
/**
* The list of players in this team.
*/
private final static List<Player> players = new LinkedList<Player>();
/**
* A list of players in the waiting room.
*/
private final static List<Player> waitingPlayers = new LinkedList<Player>();
I'm getting this error:
java.util.ConcurrentModificationException
[11/25/11 3:36 PM]: at java.util.SubList.checkForComodification(Unknown Sour
ce)
[11/25/11 3:36 PM]: at java.util.SubList.listIterator(Unknown Source)
[11/25/11 3:36 PM]: at java.util.AbstractList.listIterator(Unknown Source)
[11/25/11 3:36 PM]: at java.util.SubList.iterator(Unknown Source)
[11/25/11 3:36 PM]: at java.util.AbstractCollection.contains(Unknown Source)
[11/25/11 3:36 PM]: at java.util.AbstractCollection.removeAll(Unknown Source)
code listed here.
public static void enterGame(final Client c) {
if(waitingPlayers.size() < 4) {
c.sendMessage("Waiting for 4 players");
return; // not enough players
}
// Picks 4 ppl from the list
System.out.println("Starting new game");
Collections.shuffle(waitingPlayers);
System.out.println("Picking random players");
final List<Player> picked = waitingPlayers.subList(0, 4);
players.addAll(picked);
waitingPlayers.removeAll(picked);
if(players.contains(c)) {
c.sendMessage("Your on a team!");
}
}
The subList becomes invalid when the underlying original list changes. Make a copy of it, for example using
List<Player> picked = new ArrayList<Player>(waitingPlayers.subList(0,4));
waitingPlayers.removeAll(picked);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With