2016-03-07 24 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"); 
    } 

} 

W powyższym kodzie mam instancję klasy prostej i klasy, mam również instancję lokalną o tej samej nazwie. Po uruchomieniu powyższego kodu otrzymuję poniżej wyjątkiem:Dlaczego otrzymuję wyjątek StackOverflowError w moim konstruktorze

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

Wygląda to na próbę wdrożenia wzorca Singleton. Istnieje wiele sposobów na zrobienie tego. Poszukaj Java Singleton, a znajdziesz wiele przykładów. –

+1

Miły Q zapytać na StackOverflow! Powinieneś dodać "nie gra słów";). – Astrogator

Odpowiedz

23

Twoim głównym metoda tworzy Cloning instancji (Cloning c=new Cloning();), co powoduje inicjalizacji zmiennej instancji c (Cloning c=new Cloning();), co stwarza kolejną instancję Cloning, i tak dalej ...

Masz nieskończony łańcuch wywołań konstruktora, który prowadzi do StackOverflowError.

W powyższym kodzie Mam proste klasy i instancji poziomie klasy

Nie masz instancji poziomie klasy. Masz instancję na poziomie instancji. Jeśli chcesz instancji poziomie klasy, zmień

Cloning c=new Cloning(); 

do

static Cloning c=new Cloning(); 
+0

Właściwie to * myślę, * że winowajcą jest stworzenie nie-statycznej instancji 'Cloning' poza' main'. – Bathsheba

+2

@Bathsheba Cóż, oryginalna instancja jest tworzona przez główną metodę. Bez tej instancji nie zainicjowano żadnej zmiennej instancji, a więc łańcuch nieskończonych wywołań konstruktora nie zostałby uruchomiony. Zgadzam się, że błąd prawdopodobnie nie deklaruje zmiennej instancji jako statycznej (co wydaje się być tym, co chciał OP). – Eran

+0

IOops. Masz rację, przekaż wygraną! – Bathsheba

7

możliwość wystąpienia klasy Cloning każdym razem Cloning jest wykonana, co powoduje rekursji na dawałaby.

7

Nie znaczy pisać static Cloning c = new Cloning();pozamain, lubc = new Cloning();ciągumain zamiast?

W przeciwnym razie otrzymasz nowe wystąpienie c za każdym razem, gdy zostanie ono uruchomione, co spowoduje StackOverflowError.

Obecnie stworzenie lokalnej c w Cloning c = new Cloning(); (który cienie dziedzinie c) skopuje całość.

Powiązane problemy