2015-04-27 325 views
-5
public class ClassA { 
     public void count(int i) 
     { 
      count(++i); //throws StackOverFlowError 
     } 
     public static void main(String[] args) { 
      ClassA a = new ClassA(); 
      a.count(3); 
     } 
    } 

当我调试代码时,我可以看到它在count方法内的调用count方法,但是在pre-increment之后,为什么在不退出方法的情况下继续递增i变量?为什么会抛出StackOverflowError?

+4

您再次使用递增的值调用该方法。这个数字无限。 – dhke

+0

放置一个条件来停止递归循环。 – Shriram

+2

您正在使用递归调用您的方法而没有任何中断条件。 – Abubakkar

回答

1

您没有递归函数的终止条件,count方法被一次又一次地调用,您将得到堆栈溢出错误。

检查以下链接了解更多信息Stack overflow link

2

它是一个递归调用(调用相同的方法本身)。基本上递归调用必须有一些在这里丢失的退出标准。

由于没有退出条件,该方法被一次又一次地调用,每次调用时它都会将一帧插入堆栈内存。最终堆栈内存越来越多,因此错误

0

正如您在问题描述中所述,您正在递归调用count(int)方法。如果您预先增量或后增量i,则没有区别。您需要编写一些退出条件才能退出此递归调用。

0

count(++i)的递归调用留下未被回收的调用堆栈帧。在具有适当尾部调用的其他语言中,当进行递归调用时,堆栈帧将被重用。请注意,在这种情况下,呼叫不会终止。

1

每一个方法调用都有自己的堆栈帧这使寄存器的内容并传递给方法的对象参数。所有这些都拥有内存空间。当一个调用递归时没有任何退出条件。对于每个调用堆栈帧,都会生成寄存器内容并开始消耗导致StackOverflow异常的内存。

相关问题