StackOverflowError при использовании потоков - PullRequest
1 голос
/ 16 июля 2011

Я работаю над программой, которая представляет собой симулятор движения снаряда с пользовательским интерфейсом.Я получаю ошибку StackOverflow, и кажется, что это происходит, когда я пытаюсь создать своих слушателей действия для моих кнопок и текстовых полей.Я понимаю, что ошибка переполнения стека связана с рекурсией, которая никогда не завершается, но я не вижу в своем коде, где это происходит.

Я решил использовать потоки в своей программе, потому что отнимающие много времени действия замедляютсяпрограмма.Так что у меня есть поток, который обрабатывает все вычисления для моделирования.

Код длинный, но вот его структура.

 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(); 
      }

 }

Полагаю, мне придется создавать и добавлять прослушиватели действий в новом потоке, но я не совсем уверен.Вот ошибки, которые я получаю:

 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)
 .....

Ответы [ 2 ]

2 голосов
/ 16 июля 2011

Да, у вас есть бесконечный цикл, хорошо. Это часть кода, которая вызывает проблему:

SimulationGUI() 
{
    createListeners();
}

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

Видишь, что не так? Оба эти метода вызывают друг друга безоговорочно и будут делать это в течение остального времени (или, по крайней мере, пока стек не заполнится). Доказательства находятся в следе стека:

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)

Видите, как методы возвращаются и четвертые вызывают друг друга? Вы, вероятно, хотите что-то похожее на это:

SimulationGUI() 
{
    createListeners();
}

public void createListeners()
{
    angleText.addActionListener(this);
}
1 голос
/ 16 июля 2011
 
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)
 

Глядя на ваш код и дамп стека, я сразу вижу следующую проблему: Каждый раз, когда вызывается ваш конструктор SimulationGUI, создается createListeners, который создает другой SimulationGUI, который вызывает createListeners, который создает другой SimulationGUI ... и т. Д. Кроме того, при каждом вызове createListeners запускается новый поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...