簡體   English   中英

Java中的堆棧溢出

[英]Stack overflow in Java

我正在為井字游戲做游戲樹。

我有一個名為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^

如您所見,由於幾乎整個木板都被“ O”覆蓋,所以它執行的動作多於1,而不是1,然后它保持不變,這就是我得到溢出異常的原因。 我的代碼有什么問題? 必須在這里結束:

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包含某些內容)時才作不同的動作。

編輯由於我得到了為什么它會溢出的答案,所以我將關閉此問題,並針對我的新問題打開另一個問題,謝謝。

您的問題是您的想法是一個無限循環。

您傳遞給buildGameTree(TreeNode)內部調用的buildGameTree(TreeNode)第218行)不會從gameOver(TreeNode)返回false。 在每一步中,您的代碼都將創建樹。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM