[英]Minesweeper stackoverflowerror
我正在为扫雷器编写一种方法,如果那里没有地雷,它将打开一个单元。 如果在地雷旁边没有相邻的单元,它将打开周围没有地雷的单元。 我经常有这个错误:
线程“ 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;
。
太多的递归是您的问题。 您的打开函数被递归调用太多次,并导致堆栈溢出。 尝试通过不进行递归来更改“ else”部分。 可能是这样的(伪代码):
public void clean(int i, int j) {
list = [(i,j)]
while list.size() > 0:
i, j = list.pop()
/*
Do stuff here:
Add neighbours to list and unhide current i,j
*/
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.