获取 java.lang.StackOverflowError

Getting java.lang.StackOverflowError

我收到一个简单 java 代码的 Whosebug 异常。我不太确定它为什么会来。有人可以看一下,让我知道哪里错了。

提前致谢。

 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.WhosebugError
at com.example.Test.<init>(Test.java:5)
at com.example.Test.<init>(Test.java:5)

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

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

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

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

请找到屏幕截图,其中这一行开始 class, 然后,这一行一遍又一遍地执行和重复相同的过程..

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

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);
    }
}