为什么New关键字(构造函数)给出StackOverFlowError?

时间:2019-02-04 06:24:43

标签: java

在下面给出的代码中,似乎应该有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)

2 个答案:

答案 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