2011-10-24 2 views
0

배경 : 내 과제는 카드 게임 (전쟁)에서 카드를 추적하기 위해 연결된 목록을 사용하는 프로그램을 작성하는 것이 었습니다. 그래서 저는 card.java, deckofcards.java, hand.java, war.java (driver)의 4 가지 프로그램을 작성했습니다. 카드에는 기본 정보가 들어 있습니다.java stackOverFlowError 예외가 1000 번 throw되었습니다.

다음
nextCard=null; 
public card(String a, String b) 
{ 
    hand=a; 
    suit=b; 
} 
public void setLast(card c) 
{ 
    if(nextCard==null) 
    { 
     nextCard = c; 
    } 
    else 
    { 
     nextCard.setLast(c); 
    } 
} 

deckofcards.java에 : 나는 방법이라고 setLast 사용하는 카드의 연결 목록에 추가 할 때

card deck, dealt; 
    public deckofcards() 
{ 
    rand = new Random(); 
    dealt = new card("0","0"); //null card place holders 
    first = new card("0","0"); 
    numcards = 52; 
    shuffle(); 
} 
    public card dealCard() 
{ 
    card c=new card("0","0"); 
    if(first!= null) 
    { 
     c = first; 
     first = first.nextCard; 
     c.nextCard = null; 
     if(dealt.toString().compareTo("00")==0) 
     { 
      dealt = c; 
     } 
     else 
     { 
      dealt.setLast(c); 
     } 
     numcards--; 
    } 
    else 
    { 
     System.out.println("Deck: ran out of cards"); 
    } 
    return c; 
} 

그렇게 deckofcards 무작위로 (52)를 생성을 (어쨌든에 생각하지만, 그게 전부 다른를

card cards; 
    int numcards; 
    public void getCard(card c) 
{ 
    System.out.println("In hand.java,getCard"); 
    if (numcards==0) 
    { 
     cards = c; 
     numcards++; 
    } 
    else 
    { 
     cards.setLast(c); 
    } 
} 
: 질문) 카드와 손 war.java

hand.java에 hand.java의 인스턴스로 거래 주문 691,363,210

및 war.java :

players = new hand[numplayers]; 
    for(int i=0;i<numplayers;i++) 
{ 
    players[i] = new hand(); 
} 
deck = new deckofcards(); 
int i=0; 
while(i<52) 
{ 
    int ii=0; 
    if((ii<numplayers)&&(i<52)) 
    { 
     players[ii].getCard(deck.dealCard()); 
     i++; 
     ii++; 
    } 
    else 
    { 
     ii=0; 
    } 
} 

출력 : card.setLast (카드의 스레드 "메인"java.lang.StackOverflowError의 에 hand.java에서 , hand.java에서 getCard , getCard 예외. java : 125) at card.setLast (card.java:125) at card.setLast (card.java:125) at card.setLast (card.java:125) at card.setLast (card.java:125) 125) at card.setLast (card.java:125) at card.setLast (card.java:125) // 번 1000 번 반복 ...

물론 코드의 일부만 제공했기 때문에 문제가 발생하면 요청시 전체 코드를 제공 할 수 있습니다.

답변

0

목록에 어딘가에 루프가 있습니다 (예 : "A-> B-> C-> D-> B"). 값 null 대신 "널 (null) 카드 자리 표시 자"를 사용하는 이유가 있습니까? 나는 setLast가 널 자리 표시 자에 대해 '00'대신 'null'값을 확인하지만 모든 코드를 보지 않고 목록에서 루프를 가져 오는 위치를 알려주지 않습니다.

+0

나는 카드에 검색 기능을 추가했기 때문에 널 (null) 카드를 사용했기 때문에 좋은 해결책이 될 것이라고 생각했다. 게다가 나는 "공중 카드 거래 카드 (public card dealcard)"를 쓰는 방법을 확신하지 못했습니다. 나는 던지는 메서드를 작성하고 싶지 않았습니다 ... 예외를 던질 수 있도록해야할까요? –

관련 문제