这个问题在这里已经有答案了:
类构造函数中的stackoverflow错误(2个答案)
一年前关门了。
在下面给出的代码中,看起来应该有 HeapMemoryOverFlowError
因为我们在对象内部创建对象,但它 StackOverflowError
.
public class JavaConcepts {
JavaConcepts jc = new JavaConcepts();
public static void main(String[] args) {
new JavaConcepts();
}
}
线程“main”中出现异常 java.lang.StackOverflowError
```
at Java.JavaConcepts.(JavaConcepts.java:5)
at Java.JavaConcepts.(JavaConcepts.java:5)
at Java.JavaConcepts.(JavaConcepts.java:5)
at Java.JavaConcepts.(JavaConcepts.java:5)
2条答案
按热度按时间2ledvvac1#
说明:在这个程序中,main()方法调用javaconcepts()方法。javaconcepts()方法递归地调用自身。此实现将导致javaconcepts()方法被无限次调用。在这种情况下,javaconcepts()方法将被无限次地添加到线程的堆栈帧中。因此,在几千次迭代之后,线程的堆栈大小限制将被超过。一旦超过堆栈大小限制,将导致StackOverflower错误
ht4b089n2#
问题在于:
那个
jc
是一个示例变量,这意味着javaconcepts类的每个示例都有一个示例变量。当javaconcepts的示例被示例化时,该变量被初始化。所以,追踪你这样做的时候会发生什么
new JavaConcepts()
. 这将创建一个新的javaconcepts示例,该示例反过来初始化jc
变量。为此,它创建了另一个javaconcepts示例,而这个示例又需要初始化另一个javaconcepts示例jc
. 这是一个接一个的过程new JavaConcepts()
初始化发生在新的堆栈帧中。最终你用完了堆栈帧,你得到了一个堆栈溢出错误。视觉上: