2016-01-02 3 views
-1

Я получаю исключение переполнения StackOverflowError при вызове метода, который содержит только инструкцию печати.Исключение StackOverflowError при вызове метода

Ниже приведен код

public class Dog { 

    Dog dog = new Dog(); 

    public static void main(String args[]){ 
     new Dog().bark(); 
    } 

    public void bark(){ 
     System.out.println("Bark"); 
    } 

} 

Но когда я удалить переменную класса (собака), код работает отлично.

+2

@Ramanlfc: вот почему я ответил как Wiki сообщества. –

+1

@Ramanlfc: нашел обман - вопрос закрыт. Обратите внимание, что, учитывая новизну оригинального плаката, я предполагаю, что он не будет знать, как Google эту * конкретную * проблему. –

+0

У вас будет такая же проблема, если вы удалите 'bark' и' main', содержащий только 'new Dog();'. Вам нужно практиковать искусство устранения красных сельдей. – molbdnilo

ответ

3

Ваша проблема здесь:

public class Dog { 

    Dog dog = new Dog(); // ************** HERE ************ 

    public static void main(String args[]){ 
     new Dog().bark(); 
    } 

    public void bark(){ 
     System.out.println("Bark"); 
    } 

} 

Ваш класс Dog создает новую версию себя всякий раз, когда он будет создан с вызовом new Dog(), который создает версию себя, что создает версию себя, что создает версию самого себя, которая создает версию самого себя, которая создает версию самого себя, которая создает версию самого себя, которая создает версию самого себя, которая создает версию самого себя и т. д.

Решение: не создавать new Dog() в пределах класса Dog, кроме основного метода! Обратите внимание, что есть другие случаи, когда это нормально, чтобы создать новый экземпляр объекта внутри себя, но всегда будьте осторожны при возможной рекурсии при этом.