java - 在线程 "main"java.lang.StackOverflowError 中获取异常

标签 java oop stack-overflow

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

Exception in thread "main" java.lang.StackOverflowError.

问题出在我创建 JavaApplication1 对象的代码中。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);
    }
}

最佳答案

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

换句话说,当您创建 JavaApplication1 的实例时,此实例会创建其 JavaApplication1 的内部实例,而此内部实例会创建另一个 JavaApplication1 实例,它再次创建实例 JavaApplication1... 直到堆栈已满。

所以当你在主方法中运行这段代码时

JavaApplication1 ja1 = new JavaApplication1();

这样的事情发生了

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

无论如何,我看不到 ja 字段在哪里被使用过,所以考虑从您的代码中删除它。

关于java - 在线程 "main"java.lang.StackOverflowError 中获取异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27234399/

相关文章:

oop - 如何遍历lua类的对象

java - StackOverflowError 与 Kotlin 中的 JPA 双向引用

java - 为什么 FileOutputStream 的 write() 方法可以写入字符,而 OutputStreamWriter 却不能?

java - volatile 在 Java 的单线程应用程序中有用吗?

oop - 适配器模式:类适配器与对象适配器

events - 什么时候使用事件?

c++ - SEH StackOverflow 异常 - 真的无法捕获吗?

java - 使用 gson api 时的 Stackoverflow

java - base64binary 被引用但未定义

java - 是否可以使用 Achartengine 绘制多个堆叠条形图?