线程“AWT-EventQueue-0”中的Java错误异常java.lang.StackOverflowError

时间:2015-01-20 20:44:03

标签: java jframe stack-overflow

我正在寻找这个错误的解决方案在控制台上写的是Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError at sun.awt.Win32GraphicsConfig.getBounds(Native Method) at sun.awt.Win32GraphicsConfig.getBounds(Unknown Source) at java.awt.Window.init(Unknown Source) at java.awt.Window.<init>(Unknown Source) at java.awt.Frame.<init>(Unknown Source) at java.awt.Frame.<init>(Unknown Source) at javax.swing.JFrame.<init>(Unknown Source) 这是我的代码 头等舱

import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
public class testing extends JFrame {

private JPanel contentPane;
private testing tes = new testing();
private boolean ranOnce = false;

public testing() {
     if (ranOnce = false) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        ranOnce = true;
                        tes = new testing();
                        tes.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    setContentPane(contentPane);

    JLabel lblTest = new JLabel("Test");
    contentPane.add(lblTest, BorderLayout.CENTER);
}
}
}

第二课

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class Test extends JFrame {

private JPanel contentPane;


public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Test frame = new Test();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}


public Test() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    JButton btnTestButton = new JButton("Test Button");
    btnTestButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            new testing();
        }
    });
    btnTestButton.setBounds(114, 90, 89, 23);
    contentPane.add(btnTestButton);
}
}

我正在使用eclipse插件窗口构建器我知道堆栈溢出异常是由太多的内存使用引起的,我认为使用if(runOnce = false)它世界修复它

2 个答案:

答案 0 :(得分:2)

testing构造函数中,每次创建testing的实例时,都会创建testing的新实例,因此您将递归创建无限数量的testing ranOnce 1}}实例。

您解决此问题的方法很好,但您的testing布尔值是一个成员变量,因此每个ranOnce 实例有一个,所以它是<当你点击构造函数时,em>总是为false。

你应该简单地ranOnce静态,这样只有一个 private testing tes = new testing(); 变量,绑定到而不是实例

编辑:如Sbodd所述,您还必须更换

private testing tes;

{{1}}

这样它在每次构造函数调用时都不会自动初始化(因此它是以无限递归方式运行的第二个原因)

答案 1 :(得分:2)

我通过删除测试类中的所有runOnce内容并将按钮单击代码更改为

来修复错误
testing s = new testing();
s.setVisible(true);
setVisible(false);