2011-11-05 24 views
6

Ten kod wskazuje błąd w czasie wykonywania:Deklarowanie instancji klasy wewnątrz tej klasy

class Animal { 
    Animal object1 = new Animal(); 

    public static void main(String[] args) {  
     Animal obj = new Animal(); 
    } 
} 

ten jest nieco inny kod z Animal obj = new Animal(); ta linia od głównej metody wykomentowane. ten kod nie pokazuje żadnego błędu czasu wykonywania.

class Animal { 
    Animal object1 = new Animal(); 

    public static void main(String[] args) {  
     // Animal obj = new Animal(); 
    } 
} 

Jak to się dzieje i jak mogę to rozwiązać? Używam wiersza polecenia do uruchomienia tego kodu.

+0

Chociaż ten jest oczywisty, ale dlaczego pominąłeś dokładny komunikat o błędzie z pytania? W przyszłych pytaniach zawsze dołączaj pełny komunikat o błędzie/wyjątku i stosu, ponieważ zwykle zawierają już odpowiedź. Można więc łatwo przetłumaczyć to dla ciebie w kategoriach laika. – BalusC

+0

My Mistake !! zobaczyłem to linia wypełnić mój wiersz polecenia: „w Animal (Animal.java:2)” (jest to błąd, że czas pracy mam kiedy wykonał ostatni kod) –

Odpowiedz

13

Jeśli masz zmienną składową, która jest inicjowana dla instancji tej samej klasy, to po utworzeniu tej instancji będzie również zawierała zmienną składową, która jest inicjowana dla instancji tej samej klasy i kiedy ta instancja zostanie utworzona, będzie również zawierała zmienną składową, która jest inicjowana dla instancji tej samej klasy, a gdy ta instancja zostanie utworzona, będzie również zawierała zmienną składową, która jest inicjowana dla instancji tej samej klasy i kiedy ta instancja zostanie utworzona, będzie również zawierała zmienną składową, która jest inicjowana dla instancji tej samej klasy, a gdy ta instancja zostanie utworzona, będzie również zawierała zmienną składową, która jest inicjowana dla instancji tej samej klasy i kiedy ta instancja zostanie utworzona, będzie również zawierała zmienną składową, która jest inicjowana dla instancji tej samej klasy, a kiedy ta instancja jest tworzona, będzie również mieć zmienną składową, która jest inicjowana dla instancji tej samej klasy, a gdy ta instancja zostanie utworzona, będzie również zawierała zmienną składową, która jest inicjowana dla instancji tej samej klasy, a kiedy ta instancja jest tworzona, będzie również mieć zmienną składową, która jest inicjowana do instancji tej samej klasy, a gdy ta instancja zostanie utworzona, będzie również zawierała zmienną składową, która jest inicjowana dla instancji tej samej klasy, a kiedy ta instancja jest tworzona, będzie również mieć zmienną składową, która jest inicjowana do instancji tej samej klasy, a gdy ta instancja zostanie utworzona, będzie również zawierała zmienną składową, która jest inicjowana dla instancji tej samej klasy, a kiedy ta instancja jest tworzona, będzie również mieć zmienną składową, która jest inicjowana dla instancji tej samej klasy, i gdy ta instancja zostanie utworzona, będzie również zawierała zmienną składową, która jest inicjowana dla instancji tej samej klasy, i gdy ta instancja jest crea ted, będzie również mieć zmienną składową, która jest inicjowana do instancji tej samej klasy ...

, a następnie stos zostanie przepełniony i zatrzyma się. Dla obiektu obiekt może mieć wskaźnik do innej instancji tej samej klasy co element, ale tworzenie tej instancji w konstruktorze lub jej inicjowanie w treści klasy lub tworzenie obiektów rekurencyjnie nie jest w porządku. dopóki twój stos nie przepełni się. Normalnie, jeśli chcesz taką zmienną składową, akceptujesz obiekt jako argument konstruktora.

+0

Dostanę stackoverflow błąd podobny do nieskończonej rekurencji ? Czy przychodzi w tym przypadku w czasie wykonywania lub kompilacji? –

+0

@PranavNandan Zdarza się to w czasie wykonywania i tak, przepełnienie stosu jest w zasadzie wynikiem skończonego komputera, który próbuje wykonać rekursję inifinite. Nieskończona rekursja próbuje utworzyć nieskończoną dużą stertę, ale pamięć zarezerwowana dla stosu jest skończona, więc w końcu skończy się. –

2

To przepełnienie stosu.

Jest podobny do wywoływania funkcji z tej samej funkcji, jak poniżej:

void func(){ 
    func(); 
} 

Będzie to powtarzać, aż wypełnia stos, a następnie program będzie awarię.

Pozdrawiam.

5

Krótka odpowiedź nieskończonej rekursji.

Długa odpowiedź, jeśli chcesz rekurencyjnych struktur danych, takich jak, że można zrobić coś takiego:

public class A { 
    A object1; 
    public A(A member) { 
    this.object1 = member; 
    } 
    public static void main(String[] args) { 
    A item = new A(new A(null)); // note the base case/termination of the recursion! 
    } 
} 

czyli

public class B { 
    B object1; 
    public void init() { 
    object1 = new B(); 
    } 
    public static void main(String[] args) { 
    B item = new B(); 
    item.init(); 
    // now item.object1 != null, but item.object1.object1 == null 
    } 
} 

W obu przypadkach trzeba będzie „Sentinel” lub „ leaf "węzły w twojej strukturze danych, które wskazują na wartość null.

Powiązane problemy