1

我收到一个错误:

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;
    }
......
}
4

2 回答 2

7

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

您的递归和 SO 错误:

您的 CardStack 构造函数将默认调用 super 的构造函数,该构造函数创建另一个 CardStack 对象,其构造函数默认调用 super 的构造函数,该构造函数创建另一个 CardStack 对象,其构造函数默认调用 super 的构造函数,该构造函数创建另一个 CardStack 对象,其构造函数将由默认调用 super 的构造函数,该构造函数创建另一个 CardStack 对象,其构造函数默认调用 super 的构造函数,该构造函数创建另一个 CardStack 对象,其构造函数.....几乎无限,直到内存耗尽。

于 2012-11-21T02:55:41.063 回答
1

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

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

于 2012-11-21T03:02:41.800 回答