问题描述
我收到一个简单的 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)
解决方法
请找到截图,这行初始化这个类, 然后再一次,这一行一遍又一遍地执行和重复相同的过程..
所以解决方案是通过以下方式做到这一点:
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
,依此类推,直到堆栈溢出。最简单的解决方案是删除此成员,因为它似乎没有在任何地方使用。