Java代码中的StackOverFlowError

时间:2016-02-16 16:49:40

标签: java stack-overflow local-variables object-initialization

我正在编写一个简单的代码,我在第2行的代码中收到了StackOverflowError:Tmp4 t = new Tmp4 (); 如果我省略第6行(p的初始化)或省略第2行,我不会收到错误。此外,我没有进行递归调用。

我想问为什么会出现这样的错误。在省略第2行或第6行时,它没有给出StackOverflowError。

此外,它仅提供我的系统或代码问题。

感谢。

public class Tmp4 {
    Tmp4 t = new Tmp4 ();

    public static void main(String[] args) {
            System.out.println("main");
            Tmp4 p = new Tmp4 ();
            System.out.println("main2");

    }
}

3 个答案:

答案 0 :(得分:1)

通过执行Tmp4 t = new Tmp4 ();,你试图在它的对象中初始化同一个类的对象,该对象进行无限递归并给你StackOverflow异常。

删除此行,如下所示:

public class Tmp4 {
    /* Remove this line */
    Tmp4 t = new Tmp4 ();

    public static void main(String[] args) {
        System.out.println("main");
        Tmp4 p = new Tmp4 ();
        System.out.println("main2");
    }
}

答案 1 :(得分:1)

当您在代码中有无限循环时就会发生StackOverFlowError,就像您在第2行中拥有它一样。

public class Tmp4 {
Tmp4 t = new Tmp4 (); // This creates an infinite loop
}

第2行称为实例初始化程序,它甚至在构造函数之前发生。现在,既然您正在创建Tmp4的另一个实例,那么它将调用它自己的实例初始化程序,它们将调用它们,依此类推。循环永远不会结束。

答案 2 :(得分:0)

public class Tmp4 {
    Tmp4 t = new Tmp4 (); //Line 4

public static void main(String[] args) {
    System.out.println("main"); // Line 1
    Tmp4 p = new Tmp4 (); //Line 2
    System.out.println("main2"); //Line 3

    }
}

当你启动程序时,第一行和第一行被执行。 第2行是初始化Tmp4类型的新对象的地方。随着初始化第4行被调用,它再次创建了一个Tmp4类型的新对象。随着t行4的初始化再次被调用,导致无限递归调用,因此StackOverflowException。删除第4行以删除StackOverflowException的原因。由于第4行引起的无限循环,第3行永远不会被执行。