我想知道为什么我这样做时会java.lang.StackOverflowError
enum Grade {
A, B, C, D, F, INCOMPLETE;
public String toString() {
System.out.println(this); //<-- error here
return "Name of enum: "+this.name()+"\n"+"Ordinal of enum: "+this.ordinal();
}
};
答案 0 :(得分:6)
很容易。在没有递归结束的情况下递归调用toString()
。
public String toString() {
System.out.println(this); //<-- this will execute toString() again
}
如果将某个对象作为参数传递,其中需要String,则java将在内部调用其toString()
方法。
答案 1 :(得分:3)
代码段中的以下行:
System.out.println(this);
内部调用
public void println(Object x) {
String s = String.valueOf(x); <---
synchronized (this) {
print(s);
newLine();
}
}
定义为:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString(); <--- leads to recursive call
}
因此导致StackOverflowError