我有标签网格(大小为n * n),我想用不规则部分填充颜色。我写了一个方法
private void fill(int j){
while(board[j].getName().equals("s")){
board[j].setBackground(Color.yellow);
try{
fill(j-1);
} catch (ArrayIndexOutOfBoundsException e){}
try{
fill(j+1);
} catch (ArrayIndexOutOfBoundsException e){}
try{
fill(j+n);
} catch (ArrayIndexOutOfBoundsException e){}
try{
fill(j-n);
} catch (ArrayIndexOutOfBoundsException e){}
}
}
我仍然得到StackOverflowError。我没有使用大部件(我的n是最大20),我试图用if替换,但是也没有用。它对于堆栈来说太大了还是可能存在无限循环?我该如何解决这个问题?
答案 0 :(得分:1)
让我们说出于某种原因
j
和j-1
中的while
条件将得到满足,j-2
不是因此,如果您调用fill(j)
程序将
while
(通过)j
条件
while
循环setBackground
j
调用fill(j-1);
。
在程序调用{{1}}之前,程序必须完成fill(j+1)
,因此控制流程将移至fill(j-1)
级别,程序将
fill(j-1)
(通过)while
条件
j-1
循环while
setBackground
调用j-1
fill((j-1)-1);
。
再次将fill(j-2)
控制流程移至fill((j-1)+1)
之前,程序将
fill(j-2)
的{{1}}条件(失败)while
j-2
因此,您的应用程序将尝试重复相同的方案,但这次是在不同的堆栈级别,这将导致StackOverwlow。
为了防止这种情况,可能会改变条件,以便测试你是否已经在这个位置,如
fill((j-1)+1)
您可以/也应该将fill(j)
更改为while(board[j].getName().equals("s") && board[j].getBackground() != Color.yellow)
。
答案 1 :(得分:0)
board[j].setName("bgSet")
后
board[j].setBackground(Color.yellow)
这可能会解决问题,否则你的时间总是如此。