欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

【Java】Java打印时报StackOverflowError,

来源: javaer 分享于  点击 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)

 

相关文章

    暂无相关文章
相关栏目:

用户点评