0

我正在编写一个简单的代码,并且在第 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");

    }
}
4

3 回答 3

1

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

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

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

于 2016-02-16T17:01:09.807 回答
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");
    }
}
于 2016-02-16T16:52:17.693 回答
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

    }
}

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

于 2016-02-16T16:57:14.103 回答