public class TestClass {
TestClass classIn = new TestClass();
public static void main(String[] args) {
TestClass classIn = new TestClass();
}
}
有谁能告诉我为什么这会导致堆栈溢出?递归调用导致堆栈溢出异常
public class TestClass {
TestClass classIn = new TestClass();
public static void main(String[] args) {
TestClass classIn = new TestClass();
}
}
有谁能告诉我为什么这会导致堆栈溢出?递归调用导致堆栈溢出异常
您的classIn
实例变量在每次创建TestClass
的实例时被初始化。因此,每次创建TestClass
的实例时,都立即创建另一个实例,这会导致无限递归。
第一个实例在main方法创建:
TestClass classIn = new TestClass();
执行的TestClass
构造之前,实例变量(classIn
你的情况)进行初始化,所以创建另一个实例,它触发创建另一个实例,等等......(直到堆栈溢出)。将
的错误,因为每当你要创建的TestClass
一个实例,它再次尝试在该行创建自身实例 -
TestClass classIn = new TestClass();
而这个递归继续进行,直到堆栈溢出。删除这条线,它应该没问题。
正如人们提到的那样,您处于无限递归状态,计算机只有在堆栈溢出之前才能做到这一点。处理递归时一个非常重要的规则是:始终,总是有一个基础类!
阶乘递归例子想:
int factorial(int n)
{
if(n = 0)
return 1;
else
return n * factorial(n-1);
}
注意的基本情况,你的人,可以手工计算。这种情况是防止溢出的情况,因为没有你的代码会保持循环。假设我没有这个基本情况下有3个。所以你会得到3 * 2 * 1 * 0 * -1 * -2 ....
只是为什么它*不*会导致SO?该递归永远不会结束,每次调用都需要一些堆栈空间。 – kiheru
使用逐行调试器。你会很快看到效果。 – Bathsheba
我认为这个问题是由于完全不了解堆栈溢出实际上是什么造成的。 – AJFarmar