0

我有标签网格(大小 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 替换 while,但也没有用。堆栈是否太大或可能存在无限循环?我该如何解决?

4

2 回答 2

1

可以说,出于某种原因

  • j并且满足意志的j-1条件,while
  • 对于其他值,例如j-2not

所以如果你调用fill(j)程序会

  1. (通过)的测试while条件j

  2. 进入while循环

  3. setBackground为了j

  4. 调用fill(j-1);.

    现在在程序调用之前fill(j+1),程序必须完成fill(j-1),所以控制流将被移到fill(j-1)水平并且程序将

    1. (通过)的测试while条件j-1

    2. 你进入while循环

    3. setBackground为了j-1

    4. fill((j-1)-1);换句话说,调用fill(j-2)

      再次在fill((j-1)+1)控制流转移到之前,fill(j-2)程序将

      1. (失败)的测试while条件j-2
      2. 程序无法进入循环,因此将从填充返回返回(j-2)
    5. 调用fill((j-1)+1)fill(j)

因此,您的应用程序将尝试重复相同的场景,但这次是在不同的堆栈级别上,这将导致 StackOverwlow。


为了防止这种情况可能会改变条件来测试你是否已经在这个位置,比如

while(board[j].getName().equals("s") && board[j].getBackground() != Color.yellow)

您可以/应该也更改whileif.

于 2013-05-25T14:08:59.857 回答
0

board[j].setName("bgSet")

board[j].setBackground(Color.yellow)

这可能会解决问题,否则您的 while 总是正确的。

于 2013-05-25T13:36:15.960 回答