java - 即使我认为我已经退出循环,我的递归循环也会出现堆栈溢出错误

标签 java recursion

我只是一个Java初学者,我正在尝试做一个扫雷程序。它即将完成,但我想做一种方法,如果打开的方 block 是“0”,也可以打开相邻的方 block

这是代码。由于某种原因,它产生了我想要的一半结果,然后推出了 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;
    }

最佳答案

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

您的检查

 zeroOpened[finalA-1+a][finalB-1+b]!=1

在再次调用 Zeros() 之前的 if 语句中,这不是它应该如何工作的。请注意,每次调用此方法时,该方法调用都会以新的 ZeroOpened 数组开始,并将其设置为全 0。

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

  1. 好的,用户点击了一个有 0 个相邻地雷的方 block 。
  2. 然后,通过递归,我将检查与该 0 相邻的 0。
  3. 因此,我输入了 Zeros() 方法
  4. 在 Zeros() 方法中,我创建一个新数组 ZeroOpened,它应该存储已显示的所有零。这是错误的,因为它没有考虑您之前可能在此方法的不同实例中打开的零。基本上,对于每个方法调用,您都有一个不同的 ZeroOpened 数组,这会导致您的问题。您应该只有一个 ZeroOpened 数组,因此请将其设为一个字段或将其作为参数放入 Zero 方法中。

再次声明,我无法完全理解发生了什么。为了更有效地调试,请确保您理解所有代码并打印一些内容以查看其是否有意义(例如您打开的 0 的索引)。

关于java - 即使我认为我已经退出循环,我的递归循环也会出现堆栈溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20816358/

相关文章:

java - 使用jsp将递归结构转换为xml

java - 使用 Spring AspectJ 进行日志记录的性能影响

batch-file - 已达到最大 setlocal 递归级别和 endlocal。解决方法?

c - 在此代码中,静态变量不会使用递归递增

java - 扩展类+新参数

python - Django Rest Framework 递归嵌套父序列化

algorithm - 快速斐波那契递归

java - 无法手动更改按钮的颜色

java - OBJECT_NOT_FOUND 尝试获取存储在 GCS 中的图像的 ServingUrl

java - 如何使用 Jersey 序列化为 Json? (我正在使用 Gradle )