我正在寻找这个错误的解决方案在控制台上写的是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)它世界修复它
答案 0 :(得分:2)
在testing
构造函数中,每次创建testing
的实例时,都会创建testing
的新实例,因此您将递归创建无限数量的testing
ranOnce
1}}实例。
您解决此问题的方法很好,但您的testing
布尔值是一个成员变量,因此每个ranOnce
实例有一个,所以它是<当你点击构造函数时,em>总是为false。
你应该简单地ranOnce
静态,这样只有一个 private testing tes = new testing();
变量,绑定到类而不是实例
private testing tes;
与
{{1}}
这样它在每次构造函数调用时都不会自动初始化(因此它是以无限递归方式运行的第二个原因)
答案 1 :(得分:2)
我通过删除测试类中的所有runOnce内容并将按钮单击代码更改为
来修复错误testing s = new testing();
s.setVisible(true);
setVisible(false);