我的递归循环给了我一个Stack Overflow错误,即使我认为我有一个退出循环

时间:2013-12-28 15:50:23

标签: java recursion

我只是一个Java初学者,我正在尝试做一个扫雷程序。它已接近完成,但我想做一个方法,如果打开的方格是“0”,也打开相邻的方块

这是代码。由于某种原因,它产生了我想要的一半结果,然后推出了StackOverflowError。

变量:

finalA = buttons row
finalB = buttons column
buttons = button containing mine etc.
value = value showing mines adjacent to the square
rows = total rows
columns = total columns

以下是代码:

public static JButton[][] zeros(int finalA, int finalB, JButton[][] buttons, int[][] value, int rows, int columns){

    int a,b;
     //I found a reason for one Stack Overflow already. It was because when there was 2 zeros adjacent the code started to "jump inbetween them". I don't know why this didn't fix the whole problem.
    int[][] zeroOpened = new int[rows][columns];

    for (a = 0 ; a < rows ; a++){
        for (b = 0 ; b < columns ; b++){
            zeroOpened[a][b] = 0;
        }
    }

    for(a=0 ; a<3 ; a++){
        for(b = 0 ; b<3 ; b++){

            if(value[finalA-1+a][finalB-1+b] == 0 ){

                buttons[finalA][finalB].setText("0");
                zeroOpened[finalA][finalB] = 1;
                //this produces the error. The first part blocks Out of bounds exception, at least I think so. Second part doesn't work. It works for a while and then produces StackOverflow.
                if(finalA-1+a < rows && finalA-1+a > 0 && finalB-1+b < columns && finalA-1+b > 0 && zeroOpened[finalA-1+a][finalB-1+b]!=1)
                {
                    zeros(finalA-1+a,finalB-1+b,buttons,value,rows,columns);
                }


        }else{
            if(finalA-1+a < rows && finalA-1+a > 0 && finalB-1+b < columns && finalA-1+b > 0)
            {
                 buttons[finalA-1+a][finalB-1+b].setText("" + value[finalA-1+a][finalB-1+b]);

            }
        }
    }
    }

    return buttons;
    }

2 个答案:

答案 0 :(得分:1)

这是我对错误的最佳猜测(我只是理解代码):

您的检查

 zeroOpened[finalA-1+a][finalB-1+b]!=1
再次调用zeros()之前的if语句中的

不是它应该如何工作的。请注意,每次调用此方法时,该方法调用都以新的zeroOpened数组开始,并且设置为全0。

尝试将zeroOpened数组移动到方法参数中或将其设为字段。如果这有点模糊,我认为这是你的程序:

  1. 好的,用户点击了一个有0个邻近地雷的广场。
  2. 然后,通过递归,我将检查0附近的0。
  3. 所以,我输入了零()方法
  4. 在zeros()方法中,我创建了一个新的数组zeroOpened ,它应该存储已经显示的所有零。这是错误的,因为它没有考虑您之前在此方法的其他实例中打开过的零。基本上,对于每个方法调用,您都有一个不同的zeroOpened数组,这会导致您的问题。你应该只有一个zeroOpened数组,所以把它作为一个字段或者把它作为参数放在零方法中。
  5. 同样,免责声明,我无法完全理解发生了什么。为了更有效地进行调试,请确保您了解所有代码并打印一些内容以查看它是否有意义(例如您打开的0的标记)。

答案 1 :(得分:0)

由于在下面的代码中进行了递归调用,堆栈溢出即将到来。

 if(finalA-1+a < rows && finalA-1+a > 0 && finalB-1+b < columns && finalA-1+b > 0 && zeroOpened[finalA-1+a][finalB-1+b]!=1)
                {
                    zeros(finalA-1+a,finalB-1+b,buttons,value,rows,columns);
                }

您正在递归调用函数zeros()。优化代码或增加VM参数中的堆栈大小