为什么这个Javaclass会报栈溢出异常?

Why does this Java class give a stack overflow exception?

这是一个简单的javaclass递归调用main方法,但是抛出栈溢出异常。堆栈溢出异常是怎么产生的?

public class NewClass {

    public static void main(String args[]) {

        main(args);

    }

}

因为您正在调用 main method,而 main method 正在调用 main method - 永远 - 直到它崩溃。

这就是当一个方法无限次地递归调用自身时会发生的情况。每次调用都会创建一个新的堆栈帧,直到堆栈溢出。

您正在递归调用 main,没有任何退出条件。因此,对于每个方法调用,都会创建一个堆栈帧,并且只有有限的内存,因此它必然会随着连续的帧创建而溢出。有一些退出条件,那么它会 运行 没问题。

当您调用方法时,JVM 将其保存在堆栈中(堆栈大小是有限的,取决于您的 JRE 配置)。 首先将调用 main 方法并将其加载到 Stack 中,然后它将再次调用 main 方法,该方法将再次进入堆栈......同样明智的是,对于每次调用,该方法将被加载到堆栈中直到被调用的方法(这里是 main ()) 将return 控制权交给它的调用方法(Again main())。 由于系统内存在某个时间点有限,堆栈将已满,此时 JVM 将引发 WhosebugError。