运行时出现StackOverFlowError

时间:2019-03-14 04:42:33

标签: java

运行此代码时,我在运行时得到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)

3 个答案:

答案 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()方法,并且相同的方法调用再次变为递归导致问题。 您应该使用班级的字段而不是相同的班级对象。