0

Я пишу простой код и Я получаю StackOverflowError в следующем коде в строке 2: Tmp4 t = new Tmp4(); я не получаю ошибку, если я опускаю линии 6 (инициализация p) или на Omiting линии 2. Кроме того, я я не делаю рекурсивный вызов.StackOverflowError в Java коде

Я хочу спросить, почему он дает такую ​​ошибку. И при отсутствии строки 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
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 

    } 
} 

При запуске программы, line1 и 2 являются первой казнены. Строка 2 - это то, где вы инициализируете новый объект типа Tmp4. С помощью инициализации вызывается строка 4, которая снова создает новый объект типа Tmp4. С инициализацией t строки 4 снова вызывается, что приводит к бесконечному рекурсивному вызову, поэтому исключение StackOverflowException. Удалите строку 4, чтобы удалить причину исключения StackOverflowException. Из-за бесконечного цикла, вызванного строкой 4, строка 3 никогда не выполняется.

+0

Это как вызов себе снова и снова (неконтролируемая рекурсия)? – IDontKnow006

+0

Спасибо MMike за это – IDontKnow006

+0

@ IDontKnow006 да, строка 4 заставляет себя звонить снова и снова. Добро пожаловать. :) – MMike

1

Поступая Tmp4 t = new Tmp4(); вы пытаетесь инициализировать объект того же класса в это объект, который собирается в бесконечной рекурсии и дает вам StackOverflow Exception.

Удалите эту строку, как показано ниже:

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"); 
    } 
} 
+0

Не удается инициализировать объект в другом объекте в Java? – IDontKnow006

+0

Да. Но в этом случае он идет в бесконечной рекурсии и, следовательно, вы получаете StackOverflow Exception. – user2004685

+0

Можете ли вы объяснить это немного подробнее – IDontKnow006

1

StackOverflowError происходит, когда у вас есть бесконечный цикл в коде так же, как у вас в строке 2.

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

Эта линия 2 называется инициализатор экземпляра, и это происходит еще до конструктора. Теперь, поскольку вы создаете еще один экземпляр Tmp4, он затем вызывает его собственные инициализаторы экземпляров, которые будут называть их и так далее. Цикл никогда не закончится.

+0

Спасибо Bozo за краткое объяснение. – IDontKnow006

Смежные вопросы