为什么抛出StackOverflowError?

时间:2015-04-27 07:05:02

标签: java scjp

   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变量?

5 个答案:

答案 0 :(得分:2)

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

由于没有退出条件,所以一次又一次地调用该方法,并且在每次调用时,它都将一个帧插入到堆栈内存中。最终堆栈内存正在溢出,因而错误

答案 1 :(得分:1)

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

请查看以下链接以获取更多信息Stack overflow link

答案 2 :(得分:1)

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

答案 3 :(得分:0)

正如您在问题描述中所说,您是递归调用count(int)方法。如果你预先增加或增加i,它没有任何区别。你需要编写一些退出条件才能退出这个递归调用。

答案 4 :(得分:0)

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