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

Java 导致堆栈溢出异常的递归调用,java,stack-overflow,Java,Stack Overflow,有人能告诉我为什么这会导致堆栈溢出吗?您的classIn实例变量在每次创建TestClass实例时都会初始化。因此,每次创建TestClass的实例时,都会立即创建另一个实例,这将导致无限递归 第一个实例是在主方法中创建的: public class TestClass { TestClass classIn = new TestClass(); public static void main(String[] args) { TestClass classI

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

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

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

public class TestClass {

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

在执行
TestClass
的构造函数之前,初始化实例变量(
classIn
,在您的例子中)以便创建另一个实例,从而触发另一个实例的创建,依此类推。。。(直到堆栈溢出)。

错误是因为当您试图创建
TestClass
的实例时,它会再次尝试在行中创建自身的实例-

TestClass classIn = new TestClass();

这将继续递归,直到堆栈溢出。删除这一行就可以了。

正如人们提到的那样,您处于无限递归中,在堆栈溢出之前,计算机只能做那么多事情。处理递归时一个非常重要的规则是:始终,始终,有一个基类

考虑阶乘递归示例:

TestClass classIn = new TestClass(); 

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

为什么它不会导致这样的结果呢?这种递归永远不会结束,每次调用都会占用一些堆栈空间。请使用逐行调试器。您将很快看到效果。我认为这个问题是由于完全不了解堆栈溢出实际上是什么造成的。我以为这是一个用于编程问题的网站。@p45这是堆栈溢出,而不是堆栈溢出例外。
int factorial(int n)
{
if(n = 0)
  return 1;
else
  return n * factorial(n-1);
}