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

3
public class TestClass {

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

有人可以告诉我为什么这会导致堆栈溢出吗?

1
为什么这不会导致堆栈溢出?因为递归永远不会结束,每次调用都会占用一些堆栈空间。 - kiheru
1
使用逐行调试器。您将会很快地看到效果。 - Bathsheba
我认为这个问题是由于完全不理解堆栈溢出的实际含义所导致的。 - AJF
1
我以为这是一个关于编程问题的网站。 - P45 Imminent
@P45Imminent 这是 StackOverflow,而不是堆栈溢出异常。 - AJF
3个回答

2
错误是因为每当您尝试创建TestClass的实例时,它会在以下行中再次尝试创建自身的实例。
TestClass classIn = new TestClass(); 

这个过程会递归进行,直到堆栈溢出。删除此行代码即可解决问题。


1
你的classIn实例变量在每次创建TestClass实例时都会被初始化。因此,每次创建TestClass实例时,你立即创建另一个实例,导致无限递归。
第一个实例是在你的主方法中创建的:
TestClass classIn = new TestClass();

在执行TestClass的构造函数之前,实例变量(在你的情况下是classIn)会被初始化,因此会创建另一个实例,从而触发创建另一个实例,以此类推...(直到堆栈溢出)。

1
正如其他人所提到的,你陷入了无限递归的局面,计算机只能在堆栈溢出之前做那么多。处理递归时非常重要的一条规则是:始终、始终、有一个基类! 想想阶乘递归的例子:
int factorial(int n)
{
if(n = 0)
  return 1;
else
  return n * factorial(n-1);
}

请注意基准情况,即您作为人可以手动计算的情况。这种情况可以避免溢出,否则您的代码将不断循环自身。假设我没有这个基准情况并且有3个数字。那么你会得到3 * 2 * 1 * 0 * -1 * -2 ....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接