【问题标题】:java.lang.StackOverflowError on implementing Runnable in a JPanel - Java Swingjava.lang.StackOverflowError 在 JPanel 中实现 Runnable - Java Swing
【发布时间】:2016-08-04 00:09:54
【问题描述】:

我有一个JPanel,它实现了Runnable 接口和overrides run() 方法。在我的JPanel 的构造函数中,我初始化了Threadprivate 类(JPanel)实例,它以new MyPanel 为参数。 在这条线上,我得到了一个Exception in thread "main" java.lang.StackOverflowError

之后出现的错误

    at java.awt.Component.setForeground(Unknown Source)
    at javax.swing.JComponent.setForeground(Unknown Source)
    at javax.swing.LookAndFeel.installColors(Unknown Source)
    at javax.swing.LookAndFeel.installColorsAndFont(Unknown Source)
    at javax.swing.plaf.basic.BasicPanelUI.installDefaults(Unknown Source)
    at javax.swing.plaf.basic.BasicPanelUI.installUI(Unknown Source)
    at javax.swing.JComponent.setUI(Unknown Source)
    at javax.swing.JPanel.setUI(Unknown Source)
    at javax.swing.JPanel.updateUI(Unknown Source)
    at javax.swing.JPanel.<init>(Unknown Source)
    at javax.swing.JPanel.<init>(Unknown Source)
    at javax.swing.JPanel.<init>(Unknown Source)

然后

    at MyPanel.<init>(MyPanel.java:39)
    at MyPanel.<init>(MyPanel.java:45)

第 39 行是我的 JPanel 构造函数,第 45 行是 Thread 类的初始化代码,即 this.generateBallsThread = new Thread(new MyPanel());

这里只放了与问题代码相关的内容。

MyPanel.java

public class MyPanel extends JPanel implements KeyListener,Runnable
{
    private static final long serialVersionUID = 1L;

    private static final Color BACKGROUND_COLOR = Color.WHITE; 
    private static final Color NPC_BALLS_COLOR = Color.RED;

    // The player is an oval
    private int playerRadius = 25;
    private int playerX;
    private int playerY;

    // True - first player position, false - otherwise
    private boolean playerPosition = true;

    // Array of all the balls threads
    private ArrayList<BallThread> balls = new ArrayList<BallThread>();

    private Thread generateBallsThread;

    public MyPanel()
    {
        this.setBackground(MyPanel.BACKGROUND_COLOR);
        this.setFocusable(true);
        this.addKeyListener(this);

        this.generateBallsThread = new Thread(new MyPanel()); // StackOverflowError
        generateBallsThread.start();
    }
}

我很困惑。这就是你使用Runnable 接口的方式,那么java 想从我这里得到什么?

【问题讨论】:

  • 你递归调用MyPanel的构造函数,因为你得到StackOverflowError

标签: java multithreading swing exception stack-overflow


【解决方案1】:

new MyPanel() 替换为this。这将停止导致堆栈溢出的无限递归调用

【讨论】:

  • 完成了这项工作,但现在我有一个java.lang.IllegalThreadStateException :)。但这是另一个问题。谢谢
【解决方案2】:

由于该行,您的代码将进入无限循环 this.generateBallsThread = new Thread(new MyPanel()); ,因为您在它的构造函数中创建类 MyPanel 的对象,它将再次调用相同的构造函数。

【讨论】:

  • 是的,我在帖子上写了:)。虽然为什么所有的反对票?这里有些人对其他问题没有耐心|:
【解决方案3】:

为什么会出现 SO 异常?MyPanel 类的构造函数会创建另一个 MyPanel。这会导致类继续创建,直到超出堆栈边界,从而导致堆栈溢出。

【讨论】:

  • 感谢您的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 2015-09-29
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
相关资源
最近更新 更多