在线程" main"中获得异常java.lang.StackOverflowError的

时间:2014-12-01 18:03:15

标签: java oop stack-overflow

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

  

线程中的异常" main" java.lang.StackOverflowError的。

问题出在代码中,我创建了一个JavaApplication1的对象。问题是App2类没有发生。如果在run方法中创建了对象ja,则代码可以正常工作。你能解释一下为什么吗?

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);
    }
}

4 个答案:

答案 0 :(得分:2)

我认为您最终会一直创建导致stackOverflow异常的JavaApplication1对象。您应该删除带注释的行。

 App2 a2 = new App2();
 JavaApplication1 ja =new JavaApplication1(); //why do you need this?
 public void run(){

答案 1 :(得分:2)

您的班级JavaApplication1包含字段JavaApplication1 ja,其中包含JavaApplication1类的另一个实例,该实例还有自己的ja字段,其中包含另一个JavaApplication1实例等等等等。

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

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

JavaApplication1

这样的事情发生了

JavaApplication1 ja1 = new JavaApplication1();

无论如何,我都没有看到 +-----------------------------------------------+ ja1 -> | JavaApplication1 instance | +-----------------------------------------------+ | | | +------------------------------------+ | | ja -> | JavaApplication1 instance | | | +------------------------------------+ | | | | | | | +-------------------------+ | | | | ja -> |JavaApplication1 instance| | | | | +-------------------------| | | | | | | | | | | | ja -> .... | | | | | +-------------------------+ | | | +------------------------------------+ | +-----------------------------------------------+ 字段的使用位置,因此请考虑将其从代码中删除。

答案 2 :(得分:1)

问题是你不能这样做:

Class Try{
Try try = new Try();
public static void main(String[] arg)
{
Try try1 = new Try();
}

上面代码的问题是首先执行将从你的main方法开始(当然在这种特殊情况下:))然后将创建try1对象并且所有的Class字段都将被初始化,因为你创建了一个对象你在同一个类中作为一个类Field()它会尝试重新初始化Class字段,最终形成一个无限循环,并且不可避免地会出现Famous STACK OVERFLOW错误!

现在,谈谈你的问题:

App2 a2 = new App2();
JavaApplication1 ja =new JavaApplication1(); //remove this line, it is causing the SO-error!!!

答案 3 :(得分:1)

您的班级JavaApplication1已成员JavaApplication1 ja已就位初始化。这意味着当您在JavaApplication1方法中创建main()的新实例时,您将再次调用隐式默认构造函数,再次调用new JavaApplication1()

如果您希望代码正常工作,请先删除

JavaApplication1 ja =new JavaApplication1();