2016-10-07 4 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 클래스의 hand 필드에서 삭제되었습니다.

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

'getRank()'메소드를 추가 할 수 있습니까? – Zarwan

+0

죄송합니다. – Rumple

+0

전체 스택 트레이스를 추가 할 수 있습니까? – Zarwan

답변

0

:

당신의 dealHand() 방법은에있는 동안, 각 반복에서 하위 목록을 반환
for(Player player : players){ 
    List<Card> hand = deck.dealHand(); 
    player.drawHand(hand); 
} 

후원 목록에 추가하는 것과 같은 시간. 이것은, 배킹리스트의 구조적인 변경이며, sublist()의 Javadoc에서는, 배킹리스트의 구조 변경 후에, 서브리스트의 메소드의 동작은 정의되지 않습니다. 따라서, 하위 목록에 대한 get() 작업이 발생합니다.

한 번에 전체 목록을 만든 다음 하위 목록으로 나누거나 각 하위 목록의 복사본을 반환하십시오.

+0

사실 그것은 문제였습니다. 하위 목록의 복사본을 만들었으므로 이제 의도 한대로 작동하고 있습니다. 고맙습니다! – Rumple

관련 문제