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");
    }
}
Другие вопросы по тегам