如何修复java.lang.StackOverflowError

时间:2016-03-13 01:56:37

标签: java recursion

我的老师让我们做了这些错误修复作业,而我无法解决这个问题。这就是我来到这里的原因。我想问一个问题和一些问题

问题:错误信息的含义是什么(我只是想知道自己的好奇心),为什么它会使用我的代码专门发生,我该如何解决?

支持:请你修改我的代码,抱歉,如果这似乎是一种获得答案的方法,但我有点迷失。

这是代码

public class Recursion
        {
         public static void indifferent( int x, int y )
          {

            System.out.print( x );
              indifferent( x - 1, y + 2 );
               System.out.print( y );

        }
     }

       public class RecursionDriver//-the driver class
        {
          public static void main( String [] args )
          {

             Recursion.indifferent( 7, -1 );

          }
        }

2 个答案:

答案 0 :(得分:3)

如果您检查代码,那么它应该是永远无法终止的。每次拨打indifferent都会再次拨打indifferent。无条件。

发生StackOverflowError因为嵌套调用太深了。 Java方法调用使用堆栈来保存局部变量(以及返回地址和其他内容)。堆栈具有固定大小。如果嵌套调用太多,则堆栈溢出。

如何解决?重写代码以执行当前正在执行的操作,但不使用使用递归。

但首先你需要了解它在做什么。你是怎样做的?嗯......基本上......你读了代码。

  

嗯,我不能完全确定什么是无关紧要的,因为这是我老师告诉我们把它作为班级的名字(她说它毫无意义,并告诉我们忽略它)

烨。忽略名称,并阅读代码实际执行的操作。如果你无法弄明白......那么"手执行"它用铅笔和纸。

答案 1 :(得分:0)

在递归中,您尝试在子问题中划分问题并尝试计算结果。因此,在递归中,您总是需要有一个基本案例。在递归的最后深度中的基本情况。一旦你到达基本案例,你就开始走出递归并获得最终答案。

在您的代码中:

public static void indifferent( int x, int y )
{
      System.out.print( x );
      indifferent( x - 1, y + 2 );
      System.out.print( y );
}

你没有基本情况,你的代码只是继续深入递归。

public static void indifferent( int x, int y )
    {
          if(x == 1) //example of a base case
              return;
          System.out.print( x );
          indifferent( x - 1, y + 2 );
          System.out.print( y );
    }