【Java】Java打印时报StackOverflowError,
分享于 点击 31216 次 点评:19
【Java】Java打印时报StackOverflowError,
打印时报StackOverflowError,排查时发现两个JavaBean在互相调用对方的toString方法,最终导致StackOverflowError,所以如果使用IDE自动生成toString方法时需要注意一下了,要避免相互调用
代码如下:
部门实体类:
public class Dept {
private int deptId;
private String deptName;
private Set<Employee> emps = new HashSet<>();
@Override
public String toString() {
return "Dept{" +
"deptId=" + deptId +
", deptName='" + deptName + '\'' +
// 此处需要调用Employee的toString()方法
", emps=" + emps +
'}';
}
// ....
}
员工实体类:
public class Employee {
private int empId;
private String empName;
private double salary;
private Dept dept;
@Override
public String toString() {
return "Employee{" +
"empId=" + empId +
", empName='" + empName + '\'' +
", salary=" + salary +
// 此处需要调用dept的toString()方法
", dept=" + dept +
'}';
}
// ...
}
若二者互相引用时,当调用Employee或Dept实例对象的toString()方法时,程序就会陷入无止境的toString。。。
@Test
public void test() {
Employee employee = new Employee();
Dept dept = new Dept();
Set<Employee> empSet = new HashSet<>();
empSet.add(employee);
dept.setEmps(empSet);
employee.setDept(dept);
System.out.println(employee);
}
错误:
java.lang.StackOverflowError
at java.lang.StringBuilder.append(StringBuilder.java:208)
at com.zjd.a_query.Employee.toString(Employee.java:17)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.zjd.a_query.Dept.toString(Dept.java:20)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.zjd.a_query.Employee.toString(Employee.java:17)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.zjd.a_query.Dept.toString(Dept.java:20)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.zjd.a_query.Employee.toString(Employee.java:17)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.zjd.a_query.Dept.toString(Dept.java:20)
at java.lang.String.valueOf(String.java:2994)
相关文章
- 暂无相关文章
用户点评