在下面给出的代码中,看起来应该是HeapMemoryOverFlowError因为我们在对象内部创建对象,但它给出了StackOverflowError.public class JavaConcepts { JavaConcepts jc = new JavaConcepts(); public static void main(String[] args) { new JavaConcepts(); }}线程“主”中的异常java.lang.StackOverflowErrorat 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)
2 回答
智慧大石
TA贡献1946条经验 获得超3个赞
问题在这里:
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)
小怪兽爱吃肉
TA贡献1852条经验 获得超1个赞
说明:在这个程序中,main() 方法调用 JavaConcepts() 方法。JavaConcepts() 方法递归调用自身。此实现将导致 JavaConcepts() 方法被无限次调用。在这种情况下,JavaConcepts() 方法将无限次添加到线程的堆栈帧中。因此,在几千次迭代之后,线程的堆栈大小限制将被超过。一旦超过堆栈大小限制,将导致 StackOverflowError
添加回答
举报
0/150
提交
取消