#java #concurrentmodification
#java #concurrentmodification
Вопрос:
Итак, я пытаюсь создать простую карточную игру, и для этого я создал класс Player, который содержит имя и руку игрока.
public class Player {
private List<Card> hand;
private String name;
public Player(String name){
this.name = name;
}
public void drawHand(List<Card> hand){
System.out.println(this.name " draws a hand.");
this.hand = hand;
}
public String throwingError(){
Card c = this.hand.get(0);
return c.getRank();
}
}
А вот движок, на котором запущена игра
public static void main(String[] args) {
int numberOfPlayers = Integer.parseInt(args[0]);
players = new Player[numberOfPlayers];
deck = createDeck();
for(int i = 0; i < numberOfPlayers; i ){
players[i] = new Player("Player" (i 1));
}
for(Player player : players){
List<Card> hand = deck.dealHand();
player.drawHand(hand);
}
String cardRank = players[turn - 1].throwingError();
}
Код выдает ConcurrentModificationException, когда доходит до последней строки функции main, что ставит меня в тупик, поскольку никакие элементы не повторяются или не удаляются из поля hand в классе Player.
Метод getRank() является частью другого класса с именем Card . Это простой способ получения
public String getRank() {
return rank;
}
И вот трассировка стека:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1231)
at java.util.ArrayList$SubList.listIterator(ArrayList.java:1091)
at java.util.AbstractList.listIterator(AbstractList.java:299)
at java.util.ArrayList$SubList.iterator(ArrayList.java:1087)
at java.util.AbstractCollection.toString(AbstractCollection.java:454)
at java.lang.String.valueOf(String.java:2981)
at java.io.PrintStream.println(PrintStream.java:821)
at Player.getRank(Player.java:22)
at GameEngine.nextTurn(GameEngine.java:32)
at GameEngine.main(GameEngine.java:27)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Комментарии:
1. Можете ли вы добавить
getRank()
метод?2. Добавил это, извините за это.
3. Можете ли вы добавить полную трассировку стека?
4. Конечно, добавил его, заранее спасибо за помощь
5. Часть кода, упомянутого в вашей трассировке стека, отсутствует.
Ответ №1:
В этом коде:
for(Player player : players){
List<Card> hand = deck.dealHand();
player.drawHand(hand);
}
ваш dealHand()
метод возвращает подсписок на каждой итерации, одновременно добавляя его в список поддержки. Это структурная модификация резервного списка, и, как указано в Javadoc for sublist()
, поведение методов подсписка не определено после структурной модификации резервного списка. Таким образом, операция get() для подсписка выдает ошибку.
Либо создайте весь список за один раз, а затем разделите его на подсписки, либо верните копии каждого подсписка.
Комментарии:
1. На самом деле это была проблема. Я сделал копию подсписка, и теперь он работает по назначению. Спасибо!