2011-10-24 30 views
0

背景:我的任務是編寫一個程序,使用鏈表來跟蹤紙牌遊戲(戰爭)中的紙牌。所以我寫了4個程序:card.java,deckofcards.java,hand.java,war.java(驅動程序)。卡持有基本信息。當添加到我使用的方法叫做setLast卡鏈表:java stackOverFlowError異常拋出1000次

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:

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隨機(應該無論如何,但是那一個不同問題)訂購卡和手他們涉及到hand.java的情況下,在war.java

hand.java:

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:

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(卡 在hand.java,getCard 在hand.java,getCard 異常在線程 「主」 java.lang.StackOverflowError的 。的java:125) 在card.setLast(card.java:125) 在card.setLast(card.java:125) 在card.setLast(card.java:125) 在card.setLast(card.java: 125) at card.setLast(card.java:125) at card.setLast(card.java:125) //重複1000次...

當然,我只提供了我認爲會導致問題的代碼段,我可以根據請求提供整個代碼。

回答

0

您的列表在某處存在循環,即「A-> B-> C-> D-> B」。是否有你使用「空卡佔位符」而不是null值的原因?我注意到setLast正在爲你的空佔位符檢查值'null'而不是'00',但是沒有看到所有的代碼,很難判斷你的列表在哪裏得到循環。

+0

我做了一張空卡,因爲我還添加了一個搜索功能卡功能,我認爲這將是一個很好的解決辦法。另外我不確定如何寫「公用卡dealcard()」。我不想寫一個方法拋出一個......我將不得不讓它拋出一個異常不是我嗎? –