2017-02-24 78 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之前打印并进入下面的行然后重复。

gw = new 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异常。这是调用的是落在循环,并导致StackOverflowError序列:

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

在Java中,一个子类总是调用它的父类的构造隐含或致电super()明确。因此,GameWorld构造函数将调用Game默认构造函数,然后再次调用GameWorld构造函数,并且它将永远持续下去。

2

GameWorld扩展了游戏。

因此,每次调用小孩ctor时,都会调用它的超类ctor。

案件解决。

您对新GameWorld的调用会隐式调用新游戏,因为编译器会将调用插入super()到您的构造函数中。

除此之外:A延伸B表示A是B.

但游戏世界是不是游戏!所以这从建模角度来看也是错误的!

+0

感谢GhostCat,这很有道理,删除类扩展了固定的问题。感谢您的详细解释。我用了你和@sara的解释。给萨拉一个答案,因为她的声望点很低。希望这是可以的。谢谢你的帮助! –