小编典典

在线程“ main”中获取异常java.lang.StackOverflowError

java

我是Java和OOP的新手,这是我的问题。当我运行以下代码时,我得到了

线程“主”中的异常java.lang.StackOverflowError。

问题出在我创建对象的代码中JavaApplication1。class不会发生问题App2。如果ja在run方法内部创建对象,则代码可以正常工作。你能解释一下为什么吗?

package javaapplication1;

public class JavaApplication1 {

    int i, k, j;

    class App2 {
        int i = 23;
        int j = 12;
    }

    App2 a2 = new App2();
    JavaApplication1 ja = new JavaApplication1();

    public void run() {
        ja.i = 10;
        a2.i = 26;
        a2.j = 18;
        System.out.println(i + "," + j + "'" + ja.i + "'"
                           + a2.i + "'" + a2.j + "'" + k);
    }

    public static void main(String[] args) {
        int k = 24;
        JavaApplication1 ja1 = new JavaApplication1();
        ja1.run();
        ja1.i = 18;
        System.out.println(ja1.i + "'" + "'" + k);
    }
}

阅读 387

收藏
2020-11-30

共1个答案

小编典典

您的类的JavaApplication1字段JavaApplication1 ja包含JavaApplication1类的另一个实例,也有自己的ja字段,包含的另一个实例JavaApplication1,依此类推。

换句话说,当您创建JavaApplication1该实例的实例时,将创建其内部实例,JavaApplication1并且此内部实例将创建另一个JavaApplication1实例,该实例再次创建实例JavaApplication1…,直到堆栈已满。

因此,当您在main方法中运行此代码时

JavaApplication1 ja1 = new JavaApplication1();

这样的事情发生

       +-----------------------------------------------+
ja1 -> | JavaApplication1 instance                     |
       +-----------------------------------------------+
       |                                               |
       |       +------------------------------------+  |
       | ja -> | JavaApplication1 instance          |  |
       |       +------------------------------------+  |
       |       |                                    |  |
       |       |       +-------------------------+  |  |
       |       | ja -> |JavaApplication1 instance|  |  |
       |       |       +-------------------------|  |  |
       |       |       |                         |  |  |
       |       |       | ja -> ....              |  |  |
       |       |       +-------------------------+  |  |
       |       +------------------------------------+  |
       +-----------------------------------------------+

无论如何,我看不到ja字段的使用位置,因此请考虑将其从代码中删除。

2020-11-30