java - 扫雷堆栈溢出错误

标签 java recursion stack-overflow minesweeper

我正在为扫雷器编写一种方法,如果那里没有地雷,它就会打开一个单元格。如果地雷旁边没有相邻的单元格,它会打开周围没有地雷的单元格。我经常遇到这个错误:

线程“AWT-EventQueue-0”中出现异常 java.lang.StackOverflowError 这是我的源代码:

public void open(int row, int col) {
    // row = vertical index of the matrix
    // col = horizontal index of matrix
    unclicked--;
    butt[row][col].setEnabled(false); // disable the called button 
    if (aray[row][col] !=0) // checks if there are no adjacent cells with an adjacent mine count >0
      butt[row][col].setText(Integer.toString(aray[row][col]));
    else{

      if(row < size-1){
        open(row+1, col);
        if(col<size-1)
          open(row+1, col+1);
        if(col>0)
          open(row+1, col+1);
      }
      if(row>0){
        if(col>0)
          open(row-1, col-1);
        if(col< size)
          open(row-1, col+1);
      }

      if(col<size-1)
        open(row, col+1);
      if(col>0)
        open(row, col-1);

      return;   
    }  
  }

非常感谢您的帮助

最佳答案

您的 Open 方法在某些情况下具有无限递归,这就是您收到 StackOverflowError 的原因。您的算法不会检查它是否已经处理过某个单元格,因此最终会一遍又一遍地调用相同的单元格,直到它耗尽堆栈。

考虑 3 x 3 网格的场景。在本例中size = 3。想象一下,单击第 2 行第 1 列,我们最终会得到以下调用堆栈:

open(2,1) //initial call
//row = 2, col = 1
open(row-1,col-1) // as row>0 and col>0
//row = 1, col = 0
open(row+1, col) //as row < size-1
//row = 2, col = 0
open(row-1, col+1) //as row > 0 and col< size
//row = 1, col = 1
open(row+1, col) //as row < size-1
//row = 2, col = 1
open(2,1) //uh-oh, this is the initial call so we're going to overflow the stack.

显然,只有在每次调用时 aray[row][col] == 0 时才会出现这种情况,否则 else 将不会执行,也不会生成额外的调用,但这只是代码如何无限重复的一个示例。

要解决此问题,您需要检查您是否已经处理过当前单元格。正如 @Marco13 在他的评论中指出的,您可以通过在方法的开头添加一个检查来查看单元格是否已被禁用,因为这意味着已经为该单元格调用了该方法:if (!butt[row][col].isEnabled()) return;

关于java - 扫雷堆栈溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24598121/

相关文章:

java - 编译 Java 硬件 API 以在 Android 中运行。

java - 开始日期和结束日期查询不起作用

java - 如何验证字符串数组是否按字母顺序排序或不使用 java?

java - 如何保存在 JPanel 上绘制的图像?

C++ 2 嵌套for循环转换为递归

haskell - 递归可以脱糖吗

javascript - 按键值递归排序 JavaScript 对象

Scala 解析器组合器 : getting a stackoverflow with packratparsers

c# - 有没有办法在递归调用之前检查可用的堆栈大小? (C#)

java - 每次我尝试修复代码时都会发生 StackOverflowError