引用枚举实例时出现StackOverflowError错误

时间:2014-03-09 12:14:00

标签: java enums

我想知道为什么我这样做时会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();
    }
};

2 个答案:

答案 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