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);
我正在寻找这个错误的解决方案,控制台上写的是 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);