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方法,但是在完成预增量之后为什么它在不退出方法的情况下继续递增i
变量?
答案 0 :(得分:2)
它是一个递归调用(调用相同的方法本身)。基本上递归调用必须有一些退出标准,这里缺少。
由于没有退出条件,所以一次又一次地调用该方法,并且在每次调用时,它都将一个帧插入到堆栈内存中。最终堆栈内存正在溢出,因而错误
答案 1 :(得分:1)
你的递归函数没有终止条件,一次又一次地调用count方法,你会得到堆栈溢出错误。
请查看以下链接以获取更多信息Stack overflow link
答案 2 :(得分:1)
每个方法调用都有自己的堆栈帧,它保存寄存器内容和传递给方法的对象参数。所有这些都拥有内存空间。当一个调用是递归的而没有任何退出条件。对于每个调用堆栈帧,生成寄存器内容并开始消耗内存,这会导致StackOverflow异常。
答案 3 :(得分:0)
正如您在问题描述中所说,您是递归调用count(int)方法。如果你预先增加或增加i,它没有任何区别。你需要编写一些退出条件才能退出这个递归调用。
答案 4 :(得分:0)
对count(++i)
的递归调用留下了一个未回收的调用堆栈帧。在具有适当尾调用的其他语言中,在进行递归调用时将重用堆栈帧。请注意,在这种情况下,呼叫不会终止。