2016-03-07 4 views
6
public class Cloning { 

    Cloning c=new Cloning(); 
    public static void main(String[] args) { 

     Cloning c=new Cloning(); 
     c.print(); 
    } 

    public void print(){ 
     System.out.println("I am in print"); 
    } 

} 

В приведенном выше коде у меня есть простой класс и экземпляр класса, у меня также есть локальный экземпляр с тем же именем. При выполнении приведенного выше кода я получаю ниже исключения:Почему я получаю исключение StackOverflowError в моем конструкторе

Exception in thread "main" java.lang.StackOverflowError 
    at com.java8.Cloning.<init>(Cloning.java:6) 
+1

Это похоже на попытку реализовать шаблон Singleton. Существует несколько способов сделать это. Сделайте поиск по Java Singleton, и вы найдете много примеров. –

+1

Ницца Q, чтобы спросить о StackOverflow! Вы должны добавить «каламбур не предназначен»;). – Astrogator

ответ

23

Ваш главный метод создает Cloning экземпляр (Cloning c=new Cloning();), что приводит к инициализации переменной экземпляра c (Cloning c=new Cloning();), что создает еще один Cloning экземпляр, и так далее ...

У вас есть бесконечная цепочка вызовов конструктора, которая ведет к StackOverflowError.

В приведенном выше коде у меня есть простой класс и экземпляр уровня класса

Вы не экземпляр уровня класса. У вас есть экземпляр уровня экземпляра. Если вы хотите экземпляр уровня класса, изменить

Cloning c=new Cloning(); 

в

static Cloning c=new Cloning(); 
+0

На самом деле я считаю, что виновником является создание нестатистического экземпляра 'Cloning' вне' main'. – Bathsheba

+2

@ Батшеба. Ну, исходный экземпляр создается основным методом. Без этого экземпляра никакая переменная экземпляра не будет инициализирована, поэтому цепочка бесконечных вызовов конструктора не запустится. Я согласен с тем, что ошибка, вероятно, не объявляет переменную экземпляра как статическую (что, по-видимому, требуется OP). – Eran

+0

IOops. Вы правы, имеете upvote! – Bathsheba

7

вы создаете экземпляр класса CloningCloning каждый раз строится, что приводит к рекурсии на конкретизации.

7

Вы не значит писать static Cloning c = new Cloning();внеmain, илиc = new Cloning();вmain вместо этого?

В противном случае вы получите новый экземпляр c каждый раз, когда он будет запущен, что вызовет StackOverflowError.

В настоящее время создание локальной c в Cloning c = new Cloning(); (который тени Поле c) пинает все это прочь.