为什么会抛出 StackOverflowError?

why it throws StackOverflowError?

   public class ClassA {
        public void count(int i)
        {
            count(++i); //throws WhosebugError
        }
        public static void main(String[] args) {
            ClassA a = new ClassA();
            a.count(3);
        }
    }

当我调试代码时,我可以看到它在 count 方法中调用了 count 方法,但是在完成预增量之后,为什么它一直在增加 i 变量而不退出该方法?

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

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

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

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

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

查看以下内容link了解更多信息Stack overflow link

每个方法调用都有自己的堆栈帧,用于保存寄存器内容和传递给方法的对象参数。所有这些都有记忆 space。当调用在没有任何退出条件的情况下进行递归时。对于每个调用堆栈帧,都会生成寄存器内容并开始消耗内存,从而导致 Whosebug 异常。