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コンストラクターは、デフォルトで、他のCardStackオブジェクトを作成するスーパーのコンストラクターを呼び出します。そのコンストラクターは、デフォルトで、他のCardStackオブジェクトを作成するスーパーのコンストラクターを呼び出します。このコンストラクターは、デフォルトで、他のCardStackオブジェクトを作成するスーパーのコンストラクターを呼び出します。デフォルトでは、他のCardStackオブジェクトを作成するスーパーのコンストラクターを呼び出します。このコンストラクターは、デフォルトで、他のCardStackオブジェクトを作成するスーパーのコンストラクターを呼び出します。このコンストラクターは、メモリがなくなるまでほぼ無限に続きます。

于 2012-11-21T02:55:41.063 に答える
1

CardStack は CreateCardDeck を継承しています。CreateCardDeck のコンストラクターは CardStack をインスタンス化します。これにより、CreateCardDeck のコンストラクターが再度呼び出されます。これが無限に繰り返されます。

コードを再配置して再設計することをお勧めします。CreateCardDeck はメソッドの名前のように見えます (動詞で始まるため)。おそらく、実際に必要なのは、CardStack の createCardDeck という静的メソッドです。

于 2012-11-21T03:02:41.800 に答える