2015-07-21 123 views
3
public class TestClass { 

    TestClass classIn = new TestClass(); 
    public static void main(String[] args) { 
     TestClass classIn = new TestClass(); 
    } 
} 

有谁能告诉我为什么这会导致堆栈溢出?递归调用导致堆栈溢出异常

+1

只是为什么它*不*会导致SO?该递归永远不会结束,每次调用都需要一些堆栈空间。 – kiheru

+1

使用逐行调试器。你会很快看到效果。 – Bathsheba

+0

我认为这个问题是由于完全不了解堆栈溢出实际上是什么造成的。 – AJFarmar

回答

1

您的classIn实例变量在每次创建TestClass的实例时被初始化。因此,每次创建TestClass的实例时,都立即创建另一个实例,这会导致无限递归。

第一个实例在main方法创建:

TestClass classIn = new TestClass(); 

执行的TestClass构造之前,实例变量(classIn你的情况)进行初始化,所以创建另一个实例,它触发创建另一个实例,等等......(直到堆栈溢出)。将

2

的错误,因为每当你要创建的TestClass一个实例,它再次尝试在该行创建自身实例 -

TestClass classIn = new TestClass(); 

而这个递归继续进行,直到堆栈溢出。删除这条线,它应该没问题。

1

正如人们提到的那样,您处于无限递归状态,计算机只有在堆栈溢出之前才能做到这一点。处理递归时一个非常重要的规则是:始终,总是有一个基础类!

阶乘递归例子想:

int factorial(int n) 
{ 
if(n = 0) 
    return 1; 
else 
    return n * factorial(n-1); 
} 

注意的基本情况,你的人,可以手工计算。这种情况是防止溢出的情况,因为没有你的代码会保持循环。假设我没有这个基本情况下有3个。所以你会得到3 * 2 * 1 * 0 * -1 * -2 ....