我不确定如何修复堆栈溢出错误



我得到一个错误:

Exception in thread "main" java.lang.StackOverflowError
at CreateCardDeck.<init>(CreateCardDeck.java:6)
at CardStack.<init>(CardStack.java:7)
at CreateCardDeck.<init>(CreateCardDeck.java:8)
at CardStack.<init>(CardStack.java:7)
at CreateCardDeck.<init>(CreateCardDeck.java:8)
...
...
...
at CardStack.<init>(CardStack.java:7)
at CreateCardDeck.<init>(CreateCardDeck.java:8)

但我不明白为什么会出现错误。在我的代码中,我指定了卡的数量等。那么这里的问题是什么?

public class CreateCardDeck
{
int deckSize = 52;
CardStack cardStack;
CreateCardDeck()
{
cardStack = new CardStack(deckSize); --------------- problem here -----
}
}

class CardStack extends CreateCardDeck
{
public CardStack(int s) ------------ problem here --------------
{
maxSize = s;
stackArray = new Card[maxSize];
top = -1;
}
......
}

让CardStack扩展CreateCardStack无意中使用了递归。不要在这里使用继承。除了导致StackOverflowError错误之外,这完全是错误的。CardStack是而不是CreateCardStack的一个更专业的版本,因此不应该扩展它。事实上,CardStack应该根本不知道CreateCardStack。

您的递归和SO错误:

默认情况下,您的CardStack构造函数将调用创建其他CardStack对象的super的构造函数,该构造函数的构造函数默认情况下将调用创建另一个CardStack的super构造函数另一个CardStack对象,其构造函数将默认调用super的构造函数,该构造函数创建另一个其构造函数。。。。。几乎是无限的,直到记忆耗尽。

CardStack继承自CreateCardDeck。CreateCardDeck的构造函数实例化了一个CardStack,这会导致CreateCardDeck的构造函数再次被调用,以此类推。

我建议重新排列并重新设计您的代码。CreateCardDeck看起来像一个方法的名称(因为它以动词开头)。也许您想要的实际上是CardStack中名为createCardDeck的静态方法。

最新更新