为什么我的代码是java.lang.StackOverflowerr?

为什么我的代码是java.lang.StackOverflowerr?,java,stack-overflow,Java,Stack Overflow,假设地图完全由零组成,您位于左上角。你要向右走一步,然后向左走一步,然后再向右走一步,依此类推 您需要以某种方式标记您已经访问过的单元,以防止无限递归 此外,捕获索引自动边界异常也不是一个好主意: 首先,我不认为它是好的风格:如果以后你要在代码中添加一些代码>尝试< /Cord>块,它也会扔索引xObjFunExtExabor ,你的代码将开始沉默失败;李> 第二,如果第一个检查(map[x1-1][y1])超出范围,您将跳过其余的检查 您可能尝试访问-1索引或长度+1 想想在边缘发生了什么您

假设地图完全由零组成,您位于左上角。你要向右走一步,然后向左走一步,然后再向右走一步,依此类推

您需要以某种方式标记您已经访问过的单元,以防止无限递归

此外,捕获
索引自动边界异常
也不是一个好主意:

  • 首先,我不认为它是好的风格:如果以后你要在代码中添加一些代码>尝试< /Cord>块,它也会扔<代码>索引xObjFunExtExabor <代码>,你的代码将开始沉默失败;李>
  • 第二,如果第一个检查(
    map[x1-1][y1]
    )超出范围,您将跳过其余的检查
      您可能尝试访问-1索引或长度+1


      想想在边缘发生了什么

      您应该删除try/catch块,或者至少打印堆栈跟踪,否则您不会注意到异常发生的时间。@michael667异常捕获在这里是一个懒人的边界检查。这是一种糟糕的编码实践,但不是导致溢出的原因。请指定
      map
      将保留的值。哦,是的,您是正确的。在这种情况下,这可能是一个无限递归问题。我应该将布尔[][]状态设置为标记我已经到达了那里,这对吗?我把状态放在代码里的什么地方?感谢收看我的提问:)
      private void findRute(int x1, int y1, int x2, int y2, int counter)
          {
              try
              {
                  if((x1 == x2) && (y1 == y2))
                  {
                      if(this.min > counter)
                      {
                          this.min = counter;
                      }
                  }
                  else
                  {
                      if(map[x1-1][y1] == 0)
                      {
                          this.findRute(x1 - 1, y1, x2, y2, counter + 1);
                      }
                      if(map[x1+1][y1] == 0)
                      {
                          this.findRute(x1 + 1, y1, x2, y2, counter + 1);
                      }
                      if(map[x1][y1 + 1] == 0)
                      {
                          this.findRute(x1, y1 + 1, x2, y2, counter + 1);
                      }
                      if(map[x1][y1 - 1] == 0)
                      {
                          this.findRute(x1, y1 - 1, x2, y2, counter + 1);
                      }
                  }
              }
              catch(IndexOutOfBoundsException z)
              {
      
              }
          }