传入空字符串作为参数时的StackOverflowError

时间:2015-12-12 14:39:47

标签: java stack-overflow

当我运行程序时,我得到一个StackOverflowError。

我的方法有什么不对?我不确定如何传递它而不会导致它无法编译。 initDialog和initComponents方法仅用于程序的其余部分来创建接口

public class DiceGUI extends JFrame {
    DiceGUI(String title) {
        super(title);
        initDialog();

        setSize(1000, 800);
        setLayout(new BorderLayout());
        add(mainPanel, BorderLayout.CENTER);

        addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
            setDefaultCloseOperation(sch.closeHandler());
       }
    });
}

    public static void main(String[] args) {
        DiceGUI diceGUI = new DiceGUI("Dice Game");
        diceGUI.setVisible(true);
    }
}

    public void initDialog() {
        dPanel = new JPanel();
        dPanel.setLayout(new BoxLayout(dPanel, BoxLayout.Y_AXIS));
        JLabel invalidInput = new JLabel("");
        String[] options = {"OK"};
        dPanel.add(new JLabel("Leave blank to make target 101, enter a number below to change it"));
        dPanel.add(invalidInput);
        JTextField text = new JTextField("");
        dPanel.add(text);

        boolean flag;
        do {
            int changeGameTarget = JOptionPane.showOptionDialog(null, dPanel, "Dice Game", JOptionPane.NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]);
            flag = sch.dialogHandler(changeGameTarget, text, invalidInput);
        } while (!flag);

        text.setText("");
    }

第二课

public class SwingComponentsHandler {
    private DiceGUI diceGUI = new DiceGUI("");


    public void restartHandler(JButton r) {
          r.addActionListener(new ActionListener() {
              @Override
              public void actionPerformed(ActionEvent e) {
                  String msg = "New Game?";
                  int yes = JOptionPane.showConfirmDialog(null, msg, "New Game?", JOptionPane.YES_NO_OPTION);

                  // Restart game
                  if (yes == JOptionPane.YES_OPTION) {
                      diceGUI.initDialog();
                  }
              }
          });
    }
}

堆栈跟踪:

Exception in thread "main" Exception in thread "main" java.lang.StackOverflowError
    at sun.awt.X11GraphicsConfig.pGetBounds(Native Method)
    at sun.awt.X11GraphicsConfig.getBounds(X11GraphicsConfig.java:314)
    at java.awt.Window.init(Window.java:505)
    at java.awt.Window.<init>(Window.java:537)
    at java.awt.Frame.<init>(Frame.java:420)
    at javax.swing.JFrame.<init>(JFrame.java:233)
    at DiceGUI.<init>(DiceGUI.java:21)
    at SwingComponentsHandler.<init>(SwingComponentsHandler.java:11)
    at DiceGUI.<init>(DiceGUI.java:16)

2 个答案:

答案 0 :(得分:1)

您对我的问题没有多大帮助,所以请改进它。我能看到你错误的唯一原因是你在Facebook上发给我全部代码,这不正常。关于SO的问题应该包含任何人找到问题的所有信息。

您正在为SwingComponentsHandler的每个实例构建DiceGUI的实例,但您还要为DiceGUI的每个实例创建SwingComponentsHandler的实例。你看到了问题吗?

让我们绘制一个依赖图。 A >> B表示A需要构建要构建的B。我们有DiceGUI >> SwingComponentsHandlerSwingComponentsHandler >> DiceGUI因此,因为依赖项是可传递的,所以我们有DiceGUI >> SwingComponentsHandler >> DiceGUI >> SwingComponentsHandler >> DiceGUI...

这永远不会结束,这是一次无限递归。 StackOverflowError始终是非常深或无限递归的标志。如果您没有编写递归函数,则调试很容易。只需查看堆栈跟踪,它应该包含一行A和一行相互调用的行B。它就像一个NPE,只需查看堆栈跟踪,您就可以在几分钟内自行调试。

答案 1 :(得分:0)

您的代码中某处有无限递归但在该示例中不可见。我倾向于相信你实例化DiceGUI()或在某处重复初始化。

确保正确使用new DiceGUI()及其方法。