线程“AWT-EventQueue-0”Java.lang.StackOverflower中出现Java错误异常
我一直在寻找这个错误的解决方案,控制台上写的是线程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 这是我的密码 头等舱线程“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
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我正在尝试这样做,当你按下一个按钮时,它会为未来打开一个新窗口:当你的堆栈溢出时,你必须在调用堆栈中寻找一个重复的模式。在检测到任何这样的模式之前,您提供的调用堆栈将被切断。显然,您无法提供完整的调用堆栈,但较长的调用堆栈会更有帮助。对于未来:当堆栈溢出时,您必须在调用堆栈中查找重复模式。在检测到任何这样的模式之前,您提供的调用堆栈将被切断。显然,您无法提供完整的调用堆栈,但更长的调用堆栈会更有帮助。