我正在为扫雷器编写一种方法,如果那里没有地雷,它就会打开一个单元格。如果地雷旁边没有相邻的单元格,它会打开周围没有地雷的单元格。我经常遇到这个错误:
线程“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/