【问题标题】:Stack overflow in JavaJava中的堆栈溢出
【发布时间】:2019-01-05 14:56:50
【问题描述】:

我正在为井字游戏制作游戏树。

我有一个名为buildGameTree 的方法,它得到一个TreeNode(treeNode 有一个包含80 个子节点的数组),它会计算每一种可能的移动。每个动作当然是1个孩子。

这是我得到的错误:

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at Main.buildGameTree(Main.java:169)
at Main.buildGameTree(Main.java:218)
at Main.buildGameTree(Main.java:218)
...
at Main.buildGameTree(Main.java:218)

这是我的代码:

private void buildGameTree(TreeNode t1)
        {
            String[][] ar1 = (String[][]) t1.getData(); //ar1 is a game board
            
            if(!gameOver(t1)) 
            {
                //printTree(t1);
                int[][]ar2 = new int[81][2];
                int line = 0;
                
                for(int k=0;k<SIZE;k++) //looking for ""
                    for(int j=0;j<SIZE;j++,line++)
                    {
                        if(ar1[k][j].equals(""))
                        {
                            ar2[line][0] = k;
                            ar2[line][1] = j;
                        }
                        else
                        {
                            ar2[line][0] = -1;
                            ar2[line][1] = -1;
                        }
                        
                    }
                
                String[][][]ar3 = new String[80][9][9]; // array of game boards
                
                for(int k=0;k<ar3.length;k++)// filling the array.. ar1 is a game board
                {
                    ar3[k] = ar1;
                }
                for(int k=0;k<ar3.length;k++)// making a move
                {
                    int i1 = ar2[k][0];
                    int i2 = ar2[k][1];
                    if(!(i1 == -1 || i2 == -1))
                        if(num%2==0)
                            ar3[k][i1][i2] = "X";
                        else
                            ar3[k][i1][i2] = "O";
                }
                
                TreeNode<String[][]>[] ar4 = new TreeNode[80]; 
                
                for(int k=0;k<ar3.length;k++)
                {
                    ar4[k] = new TreeNode<String[][]>(ar3[k]);
                }
                t1.setChildren(ar4);
                
                for(int k=0;k<ar4.length;k++)
                {
                    buildGameTree(ar4[k]);
                }
            }
        }

很抱歉放了这么多代码行,但这是显示我的问题的唯一方法。

第 169 行是:if(!gameOver(t1))

第 218 行是: buildGameTree(ar4[k]);

也许我的树太大而无法保存在内存中?

顺便说一句,游戏板是一个 9x9 的数组,空块是“”,当然还有“X”和“O”。 ar2 是一种索引表,将是游戏中的下一步动作。

编辑

public boolean gameOver(TreeNode t1)
        {
            String[][] ar1 = (String[][]) t1.getData();
            for(int k=0;k<ar1.length;k++)
            {
                for(int j=0;j<ar1.length;j++)
                    if(ar1[k][j].equals(""))
                        return false;
            }
            return true;
        }

编辑 我添加了一些打印行 n 东西来查找导致错误的原因,我发现第一块板很好,然后发生了一些奇怪的事情: 在打印功能中,我将“”更改为“^”,以便我们可以看到板

​​>
^^^^^^^^^
^^^^^^^^^
^^^^^^^^^
^^^^^^^^^
^^^^^^^^^
^^^^^^^^^
^^^^^^^^X
^^^^^^^^^
^^^^^^^^^

OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOX
OOOOOOOOO
OOOOOOOO^

OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOX
OOOOOOOOO
OOOOOOOO^

正如您所看到的,它移动了很多步而不是 1,因为几乎整个棋盘都被“O”覆盖,然后它保持不变,这就是我得到溢出异常的原因。 我的代码有什么问题? 那一定是在这里:

for(int k=0;k<ar3.length;k++)// making a move
                {
                    int i1 = ar2[k][0];
                    int i2 = ar2[k][1];
                    if(!(i1 == -1 || i2 == -1))
                        if(num%2==0)
                            ar3[k][i1][i2] = "X";
                        else
                            ar3[k][i1][i2] = "O";
                }

正如我所说的 ar3 是一组游戏板或游戏选项.. 对于每个 ar3[k] 我只有在块内容不等于 -1 时才会做出不同的举动(意味着其中有东西 X 或 O )。

编辑 既然我得到了为什么它溢出的答案,我将关闭这个问题并打开另一个关于我的新问题的问题,谢谢。

【问题讨论】:

  • “抱歉放了这么多代码行” 这不是我对“非常多”的定义,但为了尽快获得更好的帮助,请发布SSCCE。我最好的猜测是if(!gameOver(t1)) 没有返回你所期望的。您是否在调试器中运行过它并检查了值和程序流程?
  • 您是否阅读了stackoverflow.com/questions/214741/… 以了解错误?
  • 我知道这意味着什么,但我该如何解决这个问题?如何构建我的游戏树可能更有效地避免此错误
  • 我马上把这个功能加到帖子里,一会儿刷新
  • “这不是我对‘非常多’的定义..” 当然,除非你指的是我从堆栈中删除的 at Main.buildGameTree(Main.java:218) 的 719 行追踪!

标签: java stack-overflow treenode


【解决方案1】:

你遇到的问题是你的代码是一个无限循环。

您传递给buildGameTree(TreeNode) 的内部调用(第218 行)的参数不会从gameOver(TreeNode) 返回false。因此,您在每个步骤中的代码都会创建树。

【讨论】:

  • 你的意思是它总是返回 false,但是当棋盘上满是“X”和“O”时它会返回 true 意味着游戏结束。但我猜在那个过程的中间堆栈溢出了
  • 它总是返回 false,因为你总是分析空板。
  • 怎么来?检查代码上的移动注释.. 这些行只移动一次,最终他们会得到一个空位为 1 的棋盘,棋盘将满。理论上应该会发生这种情况,如果您发现我的代码中存在缺陷,我也相信实际上我想知道
  • 我不是调试器。请使用该工具,您就会知道谁来了。
  • 已编辑..但仍然找不到问题
猜你喜欢
  • 2019-05-18
  • 2013-02-19
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
相关资源
最近更新 更多