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

Java Error Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError

我正在寻找这个错误的解决方案,控制台上写的是 Exception in thread "AWT-EventQueue-0" java.lang.WhosebugError 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) 这是我的代码 首先Class

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);
}
}
}

第二个Class

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 插件 window 构建器我知道堆栈溢出异常是由过多的内存使用引起的,我想使用 if(runOnce = false) it world fix it

testing 构造函数中,每次创建 testing 的实例时都会创建一个 testing 的新实例,因此您递归地创建了无限数量的 testing 实例。

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

你应该简单地使 ranOnce 静态,这样只有 一个 ranOnce 变量,绑定到 class 而不是 实例 .

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

private testing tes = new testing();

private testing tes;

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

我通过删除测试中的所有 runOnce 内容修复了错误 class 并将按钮点击代码更改为

testing s = new testing();
s.setVisible(true);
setVisible(false);