首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的堆栈溢出

Java中的堆栈溢出
EN

Stack Overflow用户
提问于 2012-12-10 13:59:04
回答 1查看 230关注 0票数 1

我在为抽搐脚趾做一棵游戏树。

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

下面是我遇到的错误:

代码语言:javascript
复制
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)

这是我的密码:

代码语言:javascript
复制
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是一种索引表,它将是游戏中的下一步。

编辑

代码语言:javascript
复制
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来查找导致错误的原因,我发现第一个面板很好,然后发生了一些事情:在打印函数中,我将"^“改为”^“,这样我们就可以看到面板了。

代码语言:javascript
复制
^^^^^^^^^
^^^^^^^^^
^^^^^^^^^
^^^^^^^^^
^^^^^^^^^
^^^^^^^^^
^^^^^^^^X
^^^^^^^^^
^^^^^^^^^

OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOX
OOOOOOOOO
OOOOOOOO^

OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOX
OOOOOOOOO
OOOOOOOO^

正如你所看到的,它做了很多动作,而不是1,因为几乎整个板都被"O“覆盖,然后它保持不变,这就是我得到溢出异常的原因。我的密码怎么了?一定是在这里

代码语言:javascript
复制
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是一系列的棋盘或游戏选项。对于每个ar3k,只有当它不等于-1块内容时,我才会进行不同的移动(这意味着它中存在某种东西X或O)。

编辑,因为我得到了为什么它是泛滥的答案,我会关闭这个问题,并打开另一个关于我的新问题,谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-10 14:13:14

THe问题是,你的耦合器是一个无限循环。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13802410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档