在下面给出的代码中,似乎应该有HeapMemoryOverFlowError
,因为我们正在对象内部创建对象,但是它给出了StackOverflowError
。
public class JavaConcepts {
JavaConcepts jc = new JavaConcepts();
public static void main(String[] args) {
new JavaConcepts();
}
}
线程“主” java.lang.StackOverflowError
at Java.JavaConcepts.<init>(JavaConcepts.java:5)
at Java.JavaConcepts.<init>(JavaConcepts.java:5)
at Java.JavaConcepts.<init>(JavaConcepts.java:5)
at Java.JavaConcepts.<init>(JavaConcepts.java:5)
答案 0 :(得分:4)
问题在这里:
JavaConcepts jc = new JavaConcepts();
jc
是一个实例变量,这意味着每个JavaConcepts类实例都有一个实例变量。在实例化JavaConcepts实例时初始化该变量。
因此,请跟踪执行new JavaConcepts()
时发生的情况。这将创建一个JavaConcepts的新实例,该实例进而初始化该jc
变量。为此,它创建了JavaConcepts的另一个实例,而该实例又需要初始化另一个jc
。这种情况不断发生,每次new JavaConcepts()
初始化都在新的堆栈帧中进行。最终,您的堆栈框架用完了,并且出现了StackOverflowError。
视觉上:
new JavaConcepts():
jc = new JavaConcepts();
jc = new JavaConcepts();
jc = new JavaConcepts();
jc = new JavaConcepts();
...
(StackOverflowError)
答案 1 :(得分:0)
说明:在此程序中,main()方法调用JavaConcepts()方法。 JavaConcepts()方法以递归方式调用自身。此实现将导致JavaConcepts()方法被无限次调用。在这种情况下,JavaConcepts()方法将被无限次添加到线程的堆栈帧中。因此,经过数千次迭代后,将超出线程的堆栈大小限制。一旦超过堆栈大小限制,将导致StackOverflowError