Erreur Java Exception dans le thread “AWT-EventQueue-0” java.lang.StackOverflowError
Je suis a la recherche d'une solution à cette erreur ce qui est écrit sur la console est 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)
Voici mon code
Première Classe
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);
}
}
}
Deuxième Classe
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);
}
}
Je suis en utilisant le plugin eclipse fenêtre du générateur de je sais que la pile exception de dépassement de capacité est causée par une trop grande utilisation de la mémoire et j'ai pensé à l'aide de si(runOnce = false) il monde le fixer
- Pour l'avenir: lorsque vous avez un débordement de pile, vous devez regarder pour une répétition patern dans la pile d'appel. La pile d'appel vous êtes en fournissant coupe avant un tel modèle peut être détecté. Évidemment, vous ne pouvez pas fournir une pile d'appel complète, mais quelque chose de plus aurait été plus utile.
Vous devez vous connecter pour publier un commentaire.
dans le
testing
constructeur, vous créez une nouvelle instance detesting
chaque fois que vous créez une instance detesting
, si vous êtes de manière récursive la création d'un nombre infini detesting
instances.Votre approche pour résoudre ce problème est bonne, mais votre
ranOnce
booléenne est une variable de membre, en tant que tel, il y en a un partesting
instance, de sorte qu'il est toujours faux quand vous frappez le constructeur.Vous devez simplement faire
ranOnce
statique, de sorte qu'il n'est qu' unranOnce
variable, lié à la classe et pas le instances.EDIT: comme l'a déclaré Sbodd, vous aurez également à remplacer
avec
de sorte qu'il n'est pas initialisé plus automatiquement à chaque appel du constructeur (si c'est la deuxième raison pour laquelle il a couru dans une infinité de façon récursive)
private testing tes = new testing()
avecprivate testing tes
. Mais encore, je me demande ce que vous essayez d'atteindre, pourquoi êtes-vous créer untesting
instance insindetesting
instances?J'ai corrigé l'erreur en supprimant tous les runOnce des trucs dans le contrôle de la classe et de changer le bouton cliqué code de