为什么这会给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 方法,以便无限递归导致此错误我的看法。
答案 0 :(得分:2)
当您调用属性的toString
时,它会返回一个调试字符串,其中包含有关属性所有者的信息。这反过来调用所有者的toString
,你得到一个无限递归。
因此,在所有者的toString
方法中调用属性的toString
是没有意义的。
您可以将Student.toString
写为
@Override
public String toString() {
return "Student{" + "name=" + getName() + ", surname=" + getSurname() + ", id=" + getId() + '}';
}
(但你需要实例化姓氏)。