【问题标题】:java stackOverFlowError exception thrown 1000 timesjava stackOverFlowError异常抛出1000次
【发布时间】:2023-04-03 00:16:02
【问题描述】:

背景:我的任务是编写一个程序,该程序使用链表来跟踪纸牌游戏(战争)中的纸牌。所以我写了4个程序:card.java、deckofcards.java、hand.java、war.java(driver)。卡包含基本信息。添加到卡片的链接列表时,我使用了一个名为 setLast 的方法:

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 个(无论如何应该是,但那是一个不同的问题)有序卡片,然后将它们交给 war.java 中的 hand.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;
    }
}

输出: 在hand.java,getCard 在hand.java,getCard 线程“主”java.lang.StackOverflowError 中的异常 在 card.setLast(card.java:125) 在 card.setLast(card.java:125) 在 card.setLast(card.java:125) 在 card.setLast(card.java:125) 在 card.setLast(card.java:125) 在 card.setLast(card.java:125) 在 card.setLast(card.java:125) //重复1000次...

当然,我只提供了我认为导致问题的代码的 sn-p,我可以根据要求提供整个代码。

【问题讨论】:

    标签: stack stack-overflow


    【解决方案1】:

    您的列表在某处有一个循环,即“A->B->C->D->B”。您使用“空卡占位符”而不是空值是否有原因?我注意到 setLast 正在为您的 null 占位符检查值 'null' 而不是 '00',但是如果没有看到所有代码,很难判断您的列表在哪里循环。

    【讨论】:

    • 我做了一张空卡片,因为我还在卡片中添加了一个搜索功能,我认为这是一个很好的解决方法。另外,我不确定如何编写“公共卡交易卡()”。我不想写一个抛出异常的方法……我必须让它抛出一个异常,不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    相关资源
    最近更新 更多