我正在编写一个简单的代码,我在第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");
}
}
答案 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行永远不会被执行。