2014-04-28 12 views
5

Dlaczego otrzymuję błąd stackoverflow?To w Javie - Wyjątek w wątku "główny" java.lang.StackOverflowError

Moja klasa -

public class Tester { 

int id; 

Tester(int id){ 
    this.id = id; 
} 

public String toString(){ 

    String rep = "Hex: " + this + ", Id: " + this.id; 
    return rep; 
} 

} 

Główną metodą -

class Driver{ 

    public static void main(String [] args){ 

     Tester t = new Tester(123); 
     System.out.println(t); 

    } 

} 

Błąd -

Exception in thread "main" java.lang.StackOverflowError 
    at java.lang.String.length(Unknown Source) 
    at java.lang.AbstractStringBuilder.append(Unknown Source) 
    at java.lang.StringBuilder.append(Unknown Source) 
    at java.lang.StringBuilder.<init>(Unknown Source) 
    at com.examscam.model.Tester.toString(Tester.java:13) 
    at java.lang.String.valueOf(Unknown Source) 
    at java.lang.StringBuilder.append(Unknown Source) 

---------REPEAT !!! 
+0

Co ma zamiar zrobić w metodzie toString –

+0

@VineetSingla - aby wyświetlić wartość 'this'. Ale oczywiście nie mogę tego zrobić bez spowodowania błędu SO. –

+0

Drukowanie tego spowoduje tylko wydrukowanie wartości classname @ hashcode, klasa Tester ma tylko jeden identyfikator atrybutu, więc wystarczy wydrukować identyfikator powinien działać. –

Odpowiedz

3

Napisałeś:

String rep = "Hex: " + this + ", Id: " + this.id; 

W języku Java po prostu pisanie this oznacza, że ​​pośrednio wywołujesz this.toString().

Wierzę, że próbują przesłonić metodę ObjecttoString() i wewnątrz swojej wersji toString() chcesz wydrukować identyfikator został przekazany wraz z hashcode obiektu.

Tak, aby uzyskać wyjście zastąpić

String rep = "Hex: " + this + ", Id: " + this.id; 

z

String rep = "Hex: "+ this.getClass().getName().hashCode() +", Id: " + id; 

a dostaniesz wyjście jak:

Hex: 1800024669, Id: 123 
+1

Dziękuję Parul . Tak, the oracle docs toString() mają te same definicje. Borat bardzo przypomina twoją odpowiedź! Piątka ! –

+0

Możesz także użyć 'super.toString()', aby wywołać metodę super klasy. –

3

jesteś usi ng this słowo kluczowe.

String rep = "Hex: " + this + ", Id: " + this.id; 

Przedstawia bieżący obiekt. Twój obecny obiekt jest wywoływana ponownie i ponownie recursivley więc otrzymujesz

java.lang.StackOverflowError

3

jesteś dołączanie „to”. Wywołuje to metodę toString(), która ponownie wywołuje metodęString(), ... Jest to nieskończona pętla rekursji, która nie ma końca.

3

Ponieważ odwołują this w toString()

Oznacza to, że this.toString() jest nazywany, nich nieskończonej rekurencji zachodzi

15

Ponieważ

"Hex: " + this 

jest równoważna

"Hex: " + this.toString() 

i y ou're robi, że z toString(), więc toString() sama wywołuje, który nazywa się, co nazywa się ...

1

Twoja metoda toString jest winowajcą,

String rep = "Hex: " + super.toString() /* Not this */ 
    + ", Id: " + this.id; 
1

thi linię

String rep = "Hex: " + this + ", Id: " + this.id; 

staną

String rep = "Hex: " + this.toString() + ", Id: " + this.id; 

w czasie wykonywania i ponownie połączyć się c Lass za toString..wi ponownie ..

0

W linii String rep = "Hex: " + this + ", Id: " + this.id;

this 

jest równoważna

this.toString() 

i wywołanie go z toString(), będzie ponownie wywołać toString i znowu ..

0

Myślę, że nadpisujesz metodęString iw swoim nadpisanym ciele metody ponownie wywołujesz swoją metodę!dzwonisz toString pisząc ten + "" w metodzie toString

0
String rep = "Hex: " + this + ", Id: " + this.id; 

równa String rep = "Hex: " + this.toString() + ", Id: " + this.id; wewnętrznie

wola ta prowadzi do rekurencyjnego wywołania metody, które spowodują

java.lang.StackOverflowError 
0

Ponieważ stosując pierwszy w tym w metodzie toString idzie wywołanie metody toString rekursywnie, powodujące stackoverflow.

Powiązane problemy