【问题标题】:Java Error Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError线程“AWT-EventQueue-0”java.lang.StackOverflowError 中的 Java 错误异常
【发布时间】:2015-01-20 20:44:02
【问题描述】:

我正在寻找解决此错误的方法,控制台上写的是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) it world fix 它

【问题讨论】:

  • 未来:当你有堆栈溢出时,你必须在调用堆栈中寻找重复模式。在检测到任何此类模式之前,您提供的调用堆栈会中断。显然,您无法提供完整的调用堆栈,但更长的内容会更有帮助。

标签: java jframe stack-overflow


【解决方案1】:

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

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

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

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

private testing tes = new testing();

private testing tes;

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

【讨论】:

  • 除此之外,testing 的 tes 成员变量在每次调用 testing 的构造函数时也被初始化为 'new testing()' - 所以有两个地方发生了无限递归..跨度>
  • @Angivare 我做了一次静态运行,只在开始时调用了一次新测试,但我仍然无法让它工作,你能帮我吗
  • 有谁知道如何解决这个问题?
  • 如 Sbodd 所述,您还必须将 private testing tes = new testing() 替换为 private testing tes。但是,我仍然想知道您要实现什么,为什么要创建 testing 实例 insinde testing 实例?
  • @Angivare 我正在尝试这样做,以便当您按下按钮时它会打开一个新窗口
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多