Получение StackOverFlowError в Java - PullRequest
4 голосов
/ 25 февраля 2011

Это программа, которую я пишу. Я получаю исключение StackOverFlowError при запуске:

public class maininherit {

   maininherit h = new maininherit() {

        @Override
        public void mai() {
            System.out.print("inner");
        }
    };

    public static void main(String[] args){
       maininherit t=new maininherit();
       t.mai();
    }

    public void mai(){
       System.out.print("hellllll");
       h.mai();
    }
  }

Здесь я получаю StackOverflowError с, только когда использую maininherit класс в качестве ссылки во внутреннем классе. Если я использую другие классы, я не получаю эту ошибку. Кто-нибудь может мне это уточнить?

Извините, я благодарен за ваши ответы, но я сомневаюсь, что не знаю, возможно ли разумное или не только повторение инициализаций, только когда я создал экземпляр в конструкторе того же класса, знаю. Тогда как это возможно иметь несколько инициализаций?

Ответы [ 4 ]

9 голосов
/ 25 февраля 2011

Реализация вашего внутреннего класса просто переопределяет часть класса maininherit.Итак ... Вы инициализировали класс maininherit, после чего переменная h была инициализирована. Был вызван новый оператор , а затем ... внутренний класс init maininherit снова и необходимо установить переменную h.

Ваш код представляет собой бесконечный цикл инициализаций переменной h.

1 голос
/ 25 февраля 2011

Эта строка:

maininherit t=new maininherit();

Создает новый объект maininherit (я назову его m0), который имеет поле того же типа (я назову это m1)

Когда создается m0, инициализируется m1. У m1 также есть поле, поэтому m2 инициализируется. m2 также имеет поле, поэтому m3 инициализируется и т. д.

Это продолжалось бы вечно, если бы StackOverflowError oocur

1 голос
/ 25 февраля 2011

Проблема здесь не в ваших функциях main и mai, а в вашей инициализации переменной-члена maininherit h.Проблема в том, что каждый экземпляр maininherit создает объект maininherit (который, в свою очередь, создает объект maininherit и т. Д.).Отметив это как член static, вы получите общий доступ к одной копии для всех экземпляров, что решит эту проблему.

0 голосов
/ 25 февраля 2011

Ошибка Stackoverflow будет возникать всякий раз, когда вы пытаетесь создать экземпляр того же класса, что и переменная-член. Таким образом, экземпляр h создается бесконечно много раз, и поэтому возникла ошибка stackoverflow.

Например, код, который вы дали, даже без внутреннего класса будет выдавать ошибку stackoverflow

public class maininherit {

maininherit h=new maininherit();


public static void main(String[] args){
   maininherit t=new maininherit();
   t.mai();
 }

public void mai(){
    System.out.print("hellllll");
    h.mai();
}}

Избегайте создания объекта самого класса в качестве члена или поля

...