2016-10-07 8 views
2

シンプルなカードゲームを作成しようとしています。そのために、名前とプレーヤーの手を保持するPlayerクラスを作成しました。ここ リストから要素を取得しようとするとConcurrentModificationExceptionが発生する

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を投げ、それは何の要素が繰り返さないされているので、私をバッフルメイン関数の最後の行になったときやPlayerクラスのハンドフィールドから削除されます。

getRank()メソッドは、Cardという別のクラスの一部です。このコードで

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) 
+2

'getRank()'メソッドを追加できますか? – Zarwan

+0

追加されました、ごめんなさい。 – Rumple

+0

完全なスタックトレースを追加できますか? – Zarwan

答えて

0

:これは、単純なゲッター

public String getRank() { 
    return rank; 
} 

そしてここでは、スタックトレースでい

for(Player player : players){ 
    List<Card> hand = deck.dealHand(); 
    player.drawHand(hand); 
} 

にしながら、あなたのdealHand()方法は、各反復でサブリストを返します同じ時間バッキングリストに追加します。これはバッキングリストの構造的変更であり、sublist()のJavadocによれば、バッキングリストの構造変更後にサブリストのメソッドの動作は定義されません。したがって、サブリストのget()オペレーションはスローします。

リスト全体を一度に作成し、それをサブリストに分割するか、各サブリストのコピーを返します。

+0

それは実際問題でした。私はサブリストのコピーを作成し、それは意図したとおりに動作しています。ありがとうございました! – Rumple

関連する問題