2017-02-24 8 views
0

クラスからオブジェクトを作成するときにエラーが発生する。新しいクラスオブジェクトのJava java.lang.StackOverflowError作成:可能な再帰?

public class Game extends Form { 

private GameWorld gw; 

private int lives; 
private int clock; 

public Game() { 

    // initialize game 
    init(); 
    System.out.println("before gameworld: "); 

    gw = new GameWorld(); 

    System.out.println("after gameworld: "); 
    gw.init(); 
    play(); 
}... 

Gameworldの前にiterates、printsを印刷し、下の行に移動して繰り返します。

gw = new GameWorld(); 

Gameworldクラス

public class GameWorld extends Game { 

private int gameWidth; 
private int gameHeight; 

public GameWorld(){ 

    //init(); 

    System.out.println("after inititalization"); 
}... 

実行時にEclipseで次のエラーを取得します。

java.lang.StackOverflowError 
at com.codename1.ui.plaf.DefaultLookAndFeel.getPreferredSize(DefaultLookAndFeel.java:675) 
at com.codename1.ui.plaf.DefaultLookAndFeel.getLabelPreferredSize(DefaultLookAndFeel.java:665) 
at com.codename1.ui.Label.calcPreferredSize(Label.java:484) 
at com.codename1.ui.Component.preferredSizeImpl(Component.java:1985) 
at com.codename1.ui.Component.preferredSize(Component.java:2020) 
at com.codename1.ui.Component.getPreferredSize(Component.java:782) 
at com.codename1.ui.Component.getPreferredW(Component.java:862) 
at com.codename1.ui.layouts.BorderLayout.getPreferredSize(BorderLayout.java:440) 
at com.codename1.ui.Container.calcPreferredSize(Container.java:1848) 
at com.codename1.ui.Component.preferredSizeImpl(Component.java:1985) 
at com.codename1.ui.Component.preferredSize(Component.java:2020) 
at com.codename1.ui.Component.getPreferredSize(Component.java:782) 
at com.codename1.ui.Component.getPreferredH(Component.java:872) 
at com.codename1.ui.layouts.BorderLayout.positionTopBottom(BorderLayout.java:414) 
at com.codename1.ui.layouts.BorderLayout.layoutContainer(BorderLayout.java:284) 
at com.codename1.ui.Container.doLayout(Container.java:1420) 
at com.codename1.ui.Container.layoutContainer(Container.java:1412) 
at com.codename1.ui.Container.revalidate(Container.java:1058) 
at com.codename1.ui.Toolbar$ToolbarSideMenu.initMenuBar(Toolbar.java:1233) 
at com.codename1.ui.Form.setMenuBar(Form.java:3229) 
at com.codename1.ui.Form.setToolbar(Form.java:3250) 
at com.codename1.ui.Form.initGlobalToolbar(Form.java:218) 
at com.codename1.ui.Form.<init>(Form.java:210) 
at com.codename1.ui.Form.<init>(Form.java:166) 
at com.mycompany.racecar.Game.<init>(Game.java:19) 
at com.mycompany.racecar.GameWorld.<init>(GameWorld.java:8) 
at com.mycompany.racecar.Game.<init>(Game.java:25) 
at com.mycompany.racecar.GameWorld.<init>(GameWorld.java:8) 
at com.mycompany.racecar.Game.<init>(Game.java:25) 
at com.mycompany.racecar.GameWorld.<init>(GameWorld.java:8) 
at com.mycompany.racecar.Game.<init>(Game.java:25) 
at com.mycompany.racecar.GameWorld.<init>(GameWorld.java:8) 
at com.mycompany.racecar.Game.<init>(Game.java:25) 
at com.mycompany.racecar.GameWorld.<init>(GameWorld.java:8) 
at com.mycompany.racecar.Game.<init>(Game.java:25) 
at com.mycompany.racecar.GameWorld.<init>(GameWorld.java:8) 
at com.mycompany.racecar.Game.<init>(Game.java:25) 
at com.mycompany.racecar.GameWorld.<init>(GameWorld.java:8) 
at com.mycompany.racecar.Game.<init>(Game.java:25) 

私は間違っていますか?なぜそんなにループしているのですか?

+0

質問はなぜそんなにループしているのではないのですが、なぜそれはまったくループしているのですか?あなたの 'init()'メソッドには何がありますか?私は、 'Game'または' GameWorld'オブジェクトのいずれかを作成していると仮定して、init()を追加呼び出しします。 –

+0

@DavidConrad私はinit()メソッドと同じ問題をコメントアウトしました。これは意味をなさない。 –

答えて

3

Gameオブジェクトを作成する際に無限ループが発生するため、java.lang.StackOverflowError例外が発生します。

new Game() => new GameWorld() => new Game() .... 

Javaでは、子クラスは、常に暗黙的または明示的にsuper()を呼び出すことによって、親のコンストラクタを呼び出します。これは、ループに落ちるとStackOverflowErrorを引き起こす呼び出しのシーケンスです。そのため、GameWorldコンストラクタはGameデフォルトコンストラクタを呼び出し、次にGameWorldコンストラクタを再度呼び出すと、それは永遠に続きます。

2

GameWorldはゲームを拡張します。

したがって、子ctorが呼び出されるたびに、スーパークラスctorが呼び出されます。

ケースを解決しました。

新しいGameWorldを呼び出すと、コンパイラがsuper()の呼び出しをコンストラクタに挿入するため、暗黙的に新しいGameを呼び出します。その向こう

:AがBを拡張するには、AがBに

であることを意味する。しかしGameWorldはゲームではありません!これはモデリングの観点からも間違っています!

+0

GhostCatに感謝します。これは理にかなって、クラスを削除することで問題が解決されました。詳細な説明をありがとう。私はあなたと@ saraの両方の説明を使用しました。彼女が評判の点で低いので、サラに答えを与える。それはいいですね。ご協力いただきありがとうございます! –

関連する問題