为什么这个Java类会给出堆栈溢出异常?

为什么这个Java类会给出堆栈溢出异常?,java,recursion,stack-overflow,Java,Recursion,Stack Overflow,这是一个简单的java类递归地调用main方法,但它会引发堆栈溢出异常。堆栈溢出异常是如何发生的 public class NewClass { public static void main(String args[]) { main(args); } } 因为你调用的是main方法,它调用的是main方法,它永远调用main方法,直到它崩溃。当一个方法递归无限次地调用自己时,就会发生这种情况。每次调用都会创建一个新的堆栈帧,直到堆栈溢出。在没有任何退

这是一个简单的java类递归地调用main方法,但它会引发堆栈溢出异常。堆栈溢出异常是如何发生的

public class NewClass {

    public static void main(String args[]) {

        main(args);

    }

}

因为你调用的是
main方法
,它调用的是
main方法
,它永远调用
main方法
,直到它崩溃。

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

在没有任何退出条件的情况下递归校准main。因此,在每次方法调用中,都会创建一个堆栈帧,并且只有有限的内存,因此它必然会随着连续的帧创建而溢出。如果有一些退出条件,那么它将正常运行。

当您调用一个方法时,JVM会将其保存在堆栈中(堆栈大小是有限的,取决于您的JRE配置)。 首先将调用main方法,并将其加载到堆栈中,然后它将再次调用main方法,该方法将再次进入堆栈。。。与每次调用的wise一样,该方法将加载到堆栈中,直到被调用的方法(这里是main())将控件返回到调用方法(同样是main())的位置。
由于系统内存在某个时间点受到限制,堆栈将被填满,此时JVM将引发StackOverflowerError。

为什么它不应该给你这个错误?阅读了解调用堆栈是什么以及它是如何工作的。lol,有人投票关闭它,认为“主要基于意见”内存约束将始终存在,因此即使存在退出条件,但在创建大量堆栈帧后,退出条件将变为真,它将再次抛出堆栈溢出错误。明智地使用递归函数。我不明白的是它为什么会崩溃。因为它是唯一一个反复调用的方法。这会生成对象并填充jvm的堆栈吗?想象一下jvm调用一些代码,当它完成时,它需要知道返回到哪里。当然,这些信息需要保持跟踪。用来记录这些信息的空间已经用完了,这就是为什么你会收到一个堆栈溢出错误谢谢你的帮助我也这么想。但是在运行下面的代码之后,我再次混淆了公共类NewClass{public static void main(String args[]){while(true){m();}}}}}static void m(){}//这段代码运行时没有exception@Gihan你为什么感到困惑?您应该意识到,对main的每个新调用都是在前一个调用返回之前进行的,这意味着没有任何调用返回,这意味着堆栈一直在增长,直到溢出发生。是的。。。我现在明白了。。非常感谢你的帮助