繁体   English   中英

新类对象创建时的Java java.lang.StackOverflowError:可能递归?

[英]Java java.lang.StackOverflowError on New Class Object Creation: possible recursion?

从类创建对象时出现错误。

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)

我究竟做错了什么? 为什么循环这么多?

由于创建Game对象时出现无限循环,因此会出现java.lang.StackOverflowError异常。 这是陷入循环并导致StackOverflowError的调用序列:

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

在Java中,子类始终隐式地或通过显式调用super()来调用其父构造函数。 因此, GameWorld构造函数将调用Game默认构造函数,然后再次调用GameWorld构造函数,它将永远存在。

GameWorld扩展了游戏。

因此,每次调用子ctor时,都会调用其父类ctor。

案子解决了。

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

除此之外:A扩展B意味着A是B。

但是GameWorld不是游戏! 因此,从建模角度来看,这也是错误的!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM