2014-04-28 16 views
5

Tại sao tôi lại nhận được một lỗi stackoverflow?này trong Java - Exception in thread "main" java.lang.StackOverflowError

Lớp học của tôi -

public class Tester { 

int id; 

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

public String toString(){ 

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

} 

Phương pháp chính -

class Driver{ 

    public static void main(String [] args){ 

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

    } 

} 

Lỗi -

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

Mục đích của ur là làm gì trong phương pháp toString –

+0

@VineetSingla - để hiển thị giá trị của 'this'. Nhưng rõ ràng, tôi không thể làm điều đó mà không gây ra lỗi SO. –

+0

In này sẽ chỉ in các giá trị classname @ hashcode, lớp Tester chỉ có một thuộc tính id, do đó, chỉ cần in id sẽ hoạt động. –

Trả lời

3

Bạn đã viết:

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

Trong java chỉ cần viết this có nghĩa là bạn đang gián tiếp gọi this.toString().

Tôi tin rằng bạn đang cố gắng ghi đè phương thức toString()Object và bên trong phiên bản toString() bạn muốn in id bạn đã chuyển cùng với hashcode của đối tượng.

Vì vậy, để có được sản lượng thay thế

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

với

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

và bạn sẽ nhận được đầu ra như:

Hex: 1800024669, Id: 123 
+1

Cảm ơn bạn Parul . Có, tài liệu oracle toString() có cùng định nghĩa. Borat rất giống câu trả lời của bạn! Đập tay ! –

+0

Bạn cũng có thể sử dụng 'super.toString()' để gọi phương thức siêu lớp. –

3

bạn là USI ng this từ khóa.

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

Điều này thể hiện đối tượng hiện tại. đối tượng hiện tại của bạn đang được gọi là một lần nữa và một lần nữa recursivley vì vậy bạn đang nhận được

java.lang.StackOverflowError

3

Bạn đang bổ sung "này". Điều này đòi hỏi các phương thức toString(), mà một lần nữa kêu gọi toString(), ... Đó là một vòng lặp đệ quy vô hạn, mà không có một kết thúc.

3

Bởi vì bạn đang tham chiếu this trong toString()

Điều đó có nghĩa rằng this.toString() đang được gọi là, do đệ quy vô hạn đang xảy ra

15

"Hex: " + this 

tương đương với

"Hex: " + this.toString() 

và y ạn làm điều đó từ toString(), vì vậy toString() cuộc gọi riêng của mình, trong đó kêu gọi chính nó, trong đó kêu gọi chính nó ...

1

phương thức toString của bạn là thủ phạm,

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

thi dòng

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

sẽ trở thành

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

vào thời gian chạy và sẽ gọi lại c lass của toString..wi một lần nữa ..

0

Trong dòng String rep = "Hex: " + this + ", Id: " + this.id;

this 

tương đương với

this.toString() 

và gọi đó là từ toString(), một lần nữa sẽ gọi toString và một lần nữa .. .

0

tôi nghĩ rằng bạn đang trọng phương thức toString và trong cơ thể của phương pháp overrided của bạn của bạn gọi phương pháp của bạn một lần nữa!bạn đang gọi toString bằng cách viết này + "" trong phương thức toString

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

bằng String rep = "Hex: " + this.toString() + ", Id: " + this.id; nội

điều này sẽ dẫn đến phương pháp gọi đệ quy có thể khiến

java.lang.StackOverflowError 
0

Bởi vì sử dụng đầu tiên này trong phương thức toString của bạn đi trên gọi phương thức toString đệ quy dẫn đến stackoverflow.

Các vấn đề liên quan