获取 java.lang.StackOverflowError

问题描述

我收到一个简单的 Java 代码的 Stackoverflow 异常。我不太确定它为什么会出现。有人可以看看,让我知道哪里出了问题。

提前致谢。

 public class Test1 {
    public Test1(int val) {
        System.out.println(val);
    }
}

public class Test {
    Test t = new Test(10);
    public Test(int n) {
        new Test1(n);
    }

    public static void main(String[] args) {
        new Test(5);
    }
}

我低于例外。

Exception in thread "main" java.lang.StackOverflowError
at com.example.Test.<init>(Test.java:5)
at com.example.Test.<init>(Test.java:5)

解决方法

请找到截图,这行初始化这个类, 然后再一次,这一行一遍又一遍地执行和重复相同的过程..

enter image description here

所以解决方案是通过以下方式做到这一点:

public class Test1 {
    public Test1(int val) {
        System.out.println(val);
    }
}

public class Test {
    int n = 10; // this will initiate this number by 10
    public Test(int n) {
        new Test1(n);
    }

    public static void main(String[] args) {
        new Test(5);
    }
}
,

Test 类有一个 Test 类型的成员,因此会创建一个新对象 Test,它会重复执行,直到堆栈已满。

堆栈是 JVM(Java 虚拟机)保存对创建对象的引用的地方,这些对象本身被放置在堆上。因此,每次创建一个 Test 对象时,堆栈都会变大一点,直到 JVM 告诉您它不能将任何新对象引用放入其中,从而产生此异常。

可以在 here 中找到对 Java 内存分配的一个很好的解释。

,

每当您初始化 Test 的实例时,它的成员 t 也会被初始化。但是这个成员本身就是一个Test,所以它初始化自己的成员t,依此类推,直到堆栈溢出。最简单的解决方案是删除此成员,因为它似乎没有在任何地方使用。