线程“AWT-EventQueue-0”Java.lang.StackOverflower中出现Java错误异常

线程“AWT-EventQueue-0”Java.lang.StackOverflower中出现Java错误异常,java,jframe,stack-overflow,Java,Jframe,Stack Overflow,我一直在寻找这个错误的解决方案,控制台上写的是线程AWT-EventQueue-0java.lang.StackOverflowerError中的异常 在sun.awt.Win32GraphicsConfig.getBoundsNative方法中 位于sun.awt.Win32GraphicsConfig.getBoundsUnknown源 位于java.awt.Window.init的未知源 位于java.awt.Window.Unknown Source 位于java.awt.Frame.U

我一直在寻找这个错误的解决方案,控制台上写的是线程AWT-EventQueue-0java.lang.StackOverflowerError中的异常 在sun.awt.Win32GraphicsConfig.getBoundsNative方法中 位于sun.awt.Win32GraphicsConfig.getBoundsUnknown源 位于java.awt.Window.init的未知源 位于java.awt.Window.Unknown Source 位于java.awt.Frame.Unknown Source 位于java.awt.Frame.Unknown Source 位于javax.swing.JFrame.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插件窗口生成器,我知道堆栈溢出异常是由于内存使用过多造成的,我认为在测试构造函数中使用ifrunOnce=false it world fix it,每次创建测试实例时都会创建一个新的测试实例,因此,您正在递归地创建无限多的测试实例

您解决这个问题的方法是好的,但是您的ranOnce boolean是一个成员变量,因此,每个测试实例都有一个,因此当您点击构造函数时,它总是错误的

您应该简单地将ranOnce设置为静态,以便只有一个ranOnce变量绑定到类而不是实例

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

private testing tes = new testing();

因此,它不再在每次构造函数调用时自动初始化,这就是它以无限递归方式运行的第二个原因。在测试构造函数中,每次创建测试实例时,您都在创建一个新的测试实例,因此您递归地创建无限多的测试实例

您解决这个问题的方法是好的,但是您的ranOnce boolean是一个成员变量,因此,每个测试实例都有一个,因此当您点击构造函数时,它总是错误的

您应该简单地将ranOnce设置为静态,以便只有一个ranOnce变量绑定到类而不是实例

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

private testing tes = new testing();


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

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

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

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

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

除此之外,,每次调用testing的构造函数时,testing的tes成员变量也会被初始化为“new testing”-因此有两个地方会发生无限递归。@Angivare我让run One static(运行一次静态)并在开始时只调用new testing(新测试)一次,但我仍然无法使其工作。你能帮助我吗?有人知道如何修复吗这?如Sbodd所述,您还必须将私有测试tes=新测试替换为私有测试tes。但是,我仍然想知道你想要实现什么,为什么要在Inde testing instances中创建一个测试实例?@Angivare我正在尝试这样做,当你按下一个按钮时,它会打开一个新窗口,除此之外,每次调用testing的构造函数时,testing的tes成员变量也会被初始化为“new testing”-因此有两个地方会发生无限递归。@Angivare我让run One static(运行一次静态)并在开始时只调用new testing(新测试)一次,但我仍然无法使其工作。你能帮助我吗?有人知道如何修复吗这?如Sbodd所述,您还必须将私有测试tes=新测试替换为私有测试tes。但是,我仍然想知道你想要实现什么,为什么要在Inde testing instances中创建一个测试实例?@Angivare我正在尝试这样做,当你按下一个按钮时,它会为未来打开一个新窗口:当你的堆栈溢出时,你必须在调用堆栈中寻找一个重复的模式。在检测到任何这样的模式之前,您提供的调用堆栈将被切断。显然,您无法提供完整的调用堆栈,但较长的调用堆栈会更有帮助。对于未来:当堆栈溢出时,您必须在调用堆栈中查找重复模式。在检测到任何这样的模式之前,您提供的调用堆栈将被切断。显然,您无法提供完整的调用堆栈,但更长的调用堆栈会更有帮助。