任何属性toString()方法都在JavaFX

时间:2016-01-13 08:24:48

标签: java properties javafx-8 stack-overflow tostring

为什么这会给StackOverflowError?请查看示例代码

public class JavaApplication5 {

    public static void main(String[] args) {
        // TODO code application logic here

        Student st = new Student();
        st.setId(1);
        st.setName("Asus");
        st.setSurname("Corparation");
        System.out.println(st.toString());

    }

}

public class Student {

    private StringProperty name;
    private StringProperty surname;
    private IntegerProperty id;

    public IntegerProperty idProperty(){
        if(id == null){
            id= new SimpleIntegerProperty(this, "id");
        }
        return id;
    }

    public int getId(){
        return idProperty().get();             
    }

    public void setId(int stdId){
        idProperty().set(stdId);
    }

    public StringProperty nameProperty(){
        if(name == null){
            name = new SimpleStringProperty(this, "name");
        }
        return name;
    }

    public String getName(){
        return nameProperty().get();
    }

    public void setName(String stdName){
        nameProperty().set(stdName);
    }

    public StringProperty surnameProperty(){
        if(name == null){
            name = new SimpleStringProperty(this, "surame");
        }
        return name;
    }

    public String getSurname(){
        return surnameProperty().get();
    }

    public void setSurname(String stdSurname){
        nameProperty().set(stdSurname);
    }

    @Override
    public String toString() {
        return "Student{" + "name=" + name + ", surname=" + surname + ", id=" + id + '}';
    }


}

可以这个导致这个问题吗?当我调试代码时,类 IntegerPropertyBase.java 总是在追加 bean 时返回我的 toString 方法,以便无限递归导致此错误我的看法。

1 个答案:

答案 0 :(得分:2)

当您调用属性的toString时,它会返回一个调试字符串,其中包含有关属性所有者的信息。这反过来调用所有者的toString,你得到一个无限递归。

因此,在所有者的toString方法中调用属性的toString是没有意义的。

您可以将Student.toString写为

来解决此问题
@Override
public String toString() {
    return "Student{" + "name=" + getName() + ", surname=" + getSurname() + ", id=" + getId() + '}';
}

(但你需要实例化姓氏)。