为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

倚天杖 2022-06-04 15:47:48
在下面给出的代码中,看起来应该是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)


查看完整回答
反对 回复 2022-06-04
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

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



查看完整回答
反对 回复 2022-06-04
  • 2 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信