运行此代码时,我在运行时得到StackOverFlowError
。为什么我会收到此异常?
class F{
String name;
int rollNo;
F ref;
F(String name,int rollNo){
this.name = name;
this.rollNo = rollNo;
ref = this;
}
public static void main(String[] args){
F f = new F("Shivam",138);
System.out.println(f);
}
public String toString(){
return name+" "+rollNo+" "+ref;
}
}
这是我得到的例外:
Exception in thread "main" java.lang.StackOverflowError
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:449)
at java.lang.StringBuilder.append(StringBuilder.java:136)
at F.toString(F.java:20)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at F.toString(F.java:20)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at F.toString(F.java:20)
at java.lang.String.valueOf(String.java:2994)
答案 0 :(得分:5)
System.out.println(f); // cause StackOverFlow Exception
此行执行称为toString()
对象的f
方法时。和
查看toString()
public String toString(){
return name+" "+rollNo+" "+ref;
}
在其中您再次连接ref
对象,因此toString
方法递归调用无限。
将toString
的实现更改为此。
public String toString(){
return name+" "+rollNo;
}
答案 1 :(得分:1)
这是因为您正在使用ref
自引用并在toString()
中进行打印,这会导致toString()
的无限递归被调用。不确定为什么首先需要自我参考,可以在需要时使用this
。如果您确实需要ref
,则可以将其从toString()
方法中删除,并且应该可以使用。
答案 2 :(得分:1)
覆盖方法 toString()的问题,当您使用 ref 时,它会调用其 toString()方法,并且相同的方法调用再次变为递归导致问题。 您应该使用班级的字段而不是相同的班级对象。