StackOverFlowError в коде Java
Я пишу простой код и получаю StackruError в следующем коде в строке 2: Tmp4 t = new Tmp4 ();
Я не получаю ошибку, если я опускаю строку 6 (инициализация p
) или на пропущенной строке 2. Также я не делаю рекурсивный вызов.
Я хочу спросить, почему он дает такую ошибку. И если пропустить строку 2 или строку 6, это не дает StackruError.
Также это дает на моей системе только или проблема с кодом.
Благодарю.
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 ответа
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 вызывается снова, что приводит к бесконечному рекурсивному вызову, отсюда и StackruException. Удалите строку 4, чтобы устранить причину исключения StackruException. Из-за бесконечного цикла, вызванного строкой 4, строка 3 никогда не выполняется.
StackOverFlowError происходит, когда в вашем коде есть бесконечный цикл, как в строке 2.
public class Tmp4 {
Tmp4 t = new Tmp4 (); // This creates an infinite loop
}
Эта строка 2 называется инициализатором экземпляра, и это происходит еще до конструктора. Теперь, когда вы создаете другой экземпляр Tmp4, он будет вызывать свои собственные инициализаторы экземпляров, которые будут вызывать их и т. Д. Цикл никогда не закончится.
При выполнении Tmp4 t = new Tmp4 ();
вы пытаетесь инициализировать объект того же класса в его объекте, который находится в бесконечной рекурсии и дает вам Stackru
Исключение.
Удалите эту строку, как показано ниже:
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");
}
}