递归调用导致堆栈溢出异常

时间:2015-07-21 11:24:15

标签: java stack-overflow

public class TestClass {

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

有谁能告诉我为什么这会导致堆栈溢出?

3 个答案:

答案 0 :(得分:2)

错误是因为无论何时尝试创建TestClass的实例,它都会再次尝试在该行中创建自己的实例 -

TestClass classIn = new TestClass(); 

这会以递归方式继续,直到堆栈溢出。删除这一行,它应该没问题。

答案 1 :(得分:1)

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

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

TestClass classIn = new TestClass();

在执行TestClass的构造函数之前,初始化实例变量(在您的情况下为classIn),因此创建另一个实例,触发另一个实例的创建,依此类推。 (直到堆栈溢出)。

答案 2 :(得分:1)

正如人们所提到的,你处于无限递归状态,计算机在堆栈溢出之前只能做很多事情。处理递归时,一个非常重要的规则是:总是,总是有一个基类!

考虑阶乘递归示例:

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

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