StackOverflowError-怎么可能?

时间:2018-07-07 09:19:29

标签: java stack-overflow

 
package qwertyuiop;

public class Confusion {
    Confusion com = new Confusion();

    public static void main(String[] args) {
        Confusion con = new Confusion();
        System.out.println(4);
        con.A();
        System.out.println(5);
    }

    public void B() {
        System.out.println(3);
    }

    public void A() {
        System.out.println(4);
        com.B();
        System.out.println(4);
    }
}

我知道代码是错误的,但是我想知道为什么会抛出StackOverflowError。我也想知道这段代码是如何在内部执行的。

2 个答案:

答案 0 :(得分:3)

创建con时,将创建其成员(com)。当您尝试创建com时,将创建它的成员(另一个com)。重复此过程,直到堆栈溢出。

如果您不想多次发起com,则可以使其成为static成员:

static Confusion com = new Confusion();

答案 1 :(得分:1)

让我们从基础知识开始(如果您已经了解堆栈和堆,可以跳过这些基础知识):

程序执行的主要内存基本上分为两部分:堆栈和堆。

在程序中,对象的原语和引用存储在堆栈中,而对象的数据存储在堆中,该堆由存储的引用进行引用在堆栈中。

现在,每次使用new关键字时,都会将堆中的新内存分配给您的对象,并将其地址/引用存储在堆栈中。

如果您知道以下内容,请从此处阅读

针对您的问题,在构造函数中,您再次调用构造函数本身,这会导致递归情况,在这种情况下,构造函数会一次又一次地调用自身,从而再次执行 new ,再次,因此将对越来越多的堆插槽的引用添加到堆栈中,直到耗尽内存为止。

出现异常。