Java 堆栈溢出错误的帮助?

Java 堆栈溢出错误的帮助?,java,stack-overflow,Java,Stack Overflow,下面是我得到的错误: java.lang.StackOverflowError at apple.awt.CGraphicsDevice.getScreenInsets(Native Method) at apple.awt.CGraphicsDevice.getScreenInsets(CGraphicsDevice.java:673) at apple.awt.CToolkit.getScreenInsets(CToolkit.java:741) at jav

下面是我得到的错误:

java.lang.StackOverflowError
    at apple.awt.CGraphicsDevice.getScreenInsets(Native Method)
    at apple.awt.CGraphicsDevice.getScreenInsets(CGraphicsDevice.java:673)
    at apple.awt.CToolkit.getScreenInsets(CToolkit.java:741)
    at java.awt.Window.init(Window.java:394)
    at java.awt.Window.<init>(Window.java:432)
    at java.awt.Frame.<init>(Frame.java:403)
    at java.awt.Frame.<init>(Frame.java:368)
    at javax.swing.JFrame.<init>(JFrame.java:158)
    at D3D.<init>(D3D.java:35)
    at player.<init>(player.java:1)
    at D3D.<init>(D3D.java:17)
    at player.<init>(player.java:1)
这里是D3D类:

public class D3D extends JFrame
{
  player player = new player();
  mapgeneration levelmap = new mapgeneration();
  boolean ONE, TWO, THREE, FOUR, FIVE;
  boolean ONEhighlight,TWOhighlight,THREEhighlight,FOURhighlight,FIVEhighlight;
  Timer timer = new Timer(250,new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
      repaint();
    }
  });

  String tracer;

  Image Example = Toolkit.getDefaultToolkit().getImage("images/example.png");
  Image Startup = Toolkit.getDefaultToolkit().getImage("images/Startup.png");
  Image ButtonHighlight = Toolkit.getDefaultToolkit().getImage("images/ButtonHighlight.png");

  public D3D()
  {
    super();
    setSize(342,277);

      ...
    JPanel main = new JPanel()
    {
      public void paintComponent(final Graphics g)
      {
        super.paintComponent(g); 
        timer.start();
        g.drawImage(Startup,0,0,this);
        ...
      };
    };
    add(main);
  }
  public void init()
  {
    player.setPlayer();
    levelmap.populateGraph();
  }
  public static void main(String[] args)
  {
    D3D game = new D3D();
    game.setTitle("Dungens:3D");
    game.init();
    game.setVisible(true);
  }
}
我已经看了好几个小时了,把范围缩小到你在这里看到的。老实说,这可能是我正在浏览的一些愚蠢的小事


谢谢大家。

我知道你们的问题了。您的Player类扩展了D3D GUI——导致了一种疯狂的循环引用。这将导致循环不断地创建播放器和D3D对象时出现递归

为了证明我是对的,只需运行以下非常简单的代码版本:

public class D3D {
   Player player = new Player();

   public static void main(String[] args) {
      D3D game = new D3D();
   }
}

class Player extends D3D {

}
因此,当D3D对象被创建时,它创建了一个玩家对象,并且由于它扩展了D3D,它创建了另一个玩家对象,而这又是一个D3D对象,创建了另一个玩家对象,等等


但即使它没有引起递归,玩家也不应该扩展GUI,因为玩家不是GUI;它们是完全不同的逻辑结构

我看不到递归的位置,除非是因为在paintComponent方法中启动了一个Timer对象(这有点奇怪),并在同一个计时器中调用repaint()!我认为你需要为任何人创建并发布一个能够为你解决这个问题的方法;它在教室里。如果有人能告诉我这意味着什么,也许我能理解:
atd3d。(D3D.java:35)atplayer。(player.java:1
这是否意味着错误发生在D3d的第35行和player的第1行?它不会导致递归,但您仍然在paintComponent中运行它,坦率地说,您不应该这样做。不应该从该方法调用任何程序逻辑。等等。您甚至可以这样做?(即没有编译器错误?)抢手货xX@Voo:C/C++并不是唯一一种可以让你射中自己脚的语言(尽管C/C++会装好枪并瞄准你)。
public class D3D {
   Player player = new Player();

   public static void main(String[] args) {
      D3D game = new D3D();
   }
}

class Player extends D3D {

}