简体   繁体   中英

StackOverflowError when using Threads

I am working on a program that is a projectile motion simulation with a user interface. I am getting a StackOverflow error and it seems to occur where I try to create my action listeners for my buttons and text fields. I understand that a stackoverflow error relates to recursion that never exits but I am not seeing in my code where that is taking place.

I decided to use threads in my program because the time consuming activities that I have slow down the program. So I have a thread that handles all the computations for the simulation.

The code is lengthy, but here is the structure of it.

 public class SimulationGUI implements ActionListener, Runnable
 {
      //Create object references for window, panels, text fields, buttons, and labels. 

      SimulationGUI() 
      {
           //Here I instantiate all my buttons, textfields, labels, 
           //and basically set up the user interface.

           createListeners(); //This calls a method that creates my action listeners
      }   

      public void actionPerformed(ActionEvent e)
       {
           Thread thread = new Thread(this);
           thread.start();  // this calls the method run()
      }

      public void run()
      {
           //Here, I get the text for the variables  
           //calculations are performed for the projectile motion
           //I also edit three top level text fields using .setText()
      } 

      public void createListeners()
      {
           //Add action listeners for each text field
           ActionListener angleList = new SimulationGUI(); 
           angleText.addActionListener(angleList); 

           ..... 
      } 

      public static void main(String[] args)
      {
           new SimulationGUI(); 
      }

 }

My guess it that I will have to create and add the action listeners in a new thread, but I am not entirely sure. Here are the errors that I am getting:

 Exception in thread "main" java.lang.StackOverflowError
     at java.awt.Insets.<init>(Unknown Source)
     at sun.awt.windows.WToolkit.getScreenInsets(Native Method)
     at sun.awt.windows.WToolkit.getScreenInsets(Unknown Source)
     at java.awt.Window.init(Unknown Source)
     at java.awt.Window.<init>(Unknown Source)
     at java.awt.Frame.<init>(Unknown Source)
     at javax.swing.JFrame.<init>(Unknown Source)
     at SimulationGUI.<init>(SimulationGUI.java:24)
     at SimulationGUI.createListeners(SimulationGUI.java:211)
     at SimulationGUI.<init>(SimulationGUI.java:124)
     at SimulationGUI.createListeners(SimulationGUI.java:211)
     at SimulationGUI.<init>(SimulationGUI.java:124)
     at SimulationGUI.createListeners(SimulationGUI.java:211)
     at SimulationGUI.<init>(SimulationGUI.java:124)
     at SimulationGUI.createListeners(SimulationGUI.java:211)
     at SimulationGUI.<init>(SimulationGUI.java:124)
     at SimulationGUI.createListeners(SimulationGUI.java:211)
     at SimulationGUI.<init>(SimulationGUI.java:124)
     at SimulationGUI.createListeners(SimulationGUI.java:211)
     at SimulationGUI.<init>(SimulationGUI.java:124)
     at SimulationGUI.createListeners(SimulationGUI.java:211)
 .....

Yep, you've got yourself an infinite loop alright. This is the part of the code that is causing the problem:

SimulationGUI() 
{
    createListeners();
}

public void createListeners()
{
    ActionListener angleList = new SimulationGUI();
    angleText.addActionListener(angleList);
}

See what's wrong? Both of these methods call each-other unconditionally and will do so for the rest of time (or at-least until the stack is full). The evidence is in the stack trace:

at SimulationGUI.<init>(SimulationGUI.java:24)
at SimulationGUI.createListeners(SimulationGUI.java:211)
at SimulationGUI.<init>(SimulationGUI.java:124)
at SimulationGUI.createListeners(SimulationGUI.java:211)
at SimulationGUI.<init>(SimulationGUI.java:124)
at SimulationGUI.createListeners(SimulationGUI.java:211)
at SimulationGUI.<init>(SimulationGUI.java:124)
at SimulationGUI.createListeners(SimulationGUI.java:211)
at SimulationGUI.<init>(SimulationGUI.java:124)
at SimulationGUI.createListeners(SimulationGUI.java:211)
at SimulationGUI.<init>(SimulationGUI.java:124)
at SimulationGUI.createListeners(SimulationGUI.java:211)
at SimulationGUI.<init>(SimulationGUI.java:124)
at SimulationGUI.createListeners(SimulationGUI.java:211)

See how the methods go back and fourth calling each-other? You probably want something more like this:

SimulationGUI() 
{
    createListeners();
}

public void createListeners()
{
    angleText.addActionListener(this);
}
 
Exception in thread "main" java.lang.StackOverflowError
     at java.awt.Insets.(Unknown Source)
     at sun.awt.windows.WToolkit.getScreenInsets(Native Method)
     at sun.awt.windows.WToolkit.getScreenInsets(Unknown Source)
     at java.awt.Window.init(Unknown Source)
     at java.awt.Window.(Unknown Source)
     at java.awt.Frame.(Unknown Source)
     at javax.swing.JFrame.(Unknown Source)
     at SimulationGUI.(SimulationGUI.java:24)
     at SimulationGUI.createListeners(SimulationGUI.java:211)
     at SimulationGUI.(SimulationGUI.java:124)
     at SimulationGUI.createListeners(SimulationGUI.java:211)
     at SimulationGUI.(SimulationGUI.java:124)
     at SimulationGUI.createListeners(SimulationGUI.java:211)
     at SimulationGUI.(SimulationGUI.java:124)
     at SimulationGUI.createListeners(SimulationGUI.java:211)
     at SimulationGUI.(SimulationGUI.java:124)
     at SimulationGUI.createListeners(SimulationGUI.java:211)
     at SimulationGUI.(SimulationGUI.java:124)
     at SimulationGUI.createListeners(SimulationGUI.java:211)
     at SimulationGUI.(SimulationGUI.java:124)
     at SimulationGUI.createListeners(SimulationGUI.java:211)
 

From looking at your code and the stack dump, the immediate problem I see is: Every time your SimulationGUI constructor is called createListeners gets called which creates another SimulationGUI which calls createListeners which creates another SimulationGUI...etc. In addition to that, every time createListeners is called a new thread is started.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM