为什么new关键字(constructor)会给出stackoverflowerr?

uyhoqukh  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(341)

这个问题在这里已经有答案了

类构造函数中的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)

2ledvvac

2ledvvac1#

说明:在这个程序中,main()方法调用javaconcepts()方法。javaconcepts()方法递归地调用自身。此实现将导致javaconcepts()方法被无限次调用。在这种情况下,javaconcepts()方法将被无限次地添加到线程的堆栈帧中。因此,在几千次迭代之后,线程的堆栈大小限制将被超过。一旦超过堆栈大小限制,将导致StackOverflower错误

ht4b089n

ht4b089n2#

问题在于:

JavaConcepts jc = new JavaConcepts();

那个 jc 是一个示例变量,这意味着javaconcepts类的每个示例都有一个示例变量。当javaconcepts的示例被示例化时,该变量被初始化。
所以,追踪你这样做的时候会发生什么 new JavaConcepts() . 这将创建一个新的javaconcepts示例,该示例反过来初始化 jc 变量。为此,它创建了另一个javaconcepts示例,而这个示例又需要初始化另一个javaconcepts示例 jc . 这是一个接一个的过程 new JavaConcepts() 初始化发生在新的堆栈帧中。最终你用完了堆栈帧,你得到了一个堆栈溢出错误。
视觉上:

new JavaConcepts():
     jc = new JavaConcepts();
       jc = new JavaConcepts();
         jc = new JavaConcepts();
           jc = new JavaConcepts();
             ...
               (StackOverflowError)

相关问题