java Exception in thread “main“ java.lang.StackOverflowError 栈内存溢出

1 篇文章 0 订阅

原因

1.每一个方法的执行对应着虚拟机栈中一个栈帧入栈到出栈,若方法中调用了其他方法,那么就继续入栈其它方法,
2.当两个对象互相引用时,进行json转换也会无限递归解析,导致StackOverflowError
因此方法递归过深或者互相引用就会导致StackOverflowError

方法递归

原因就是在method1()方法中调用了自身,会无限循环调用

public class Demo {
    public static int count;
    public static void main(String[] args) {
        try {
            method1();
        } catch (Throwable e) {
         System.out.println("count = " + count);
            e.printStackTrace();
        }
    }

    public static void method1() {
        count++;
        method1();
    }
}

在这里插入图片描述

对象互相引用

原因就是Dept和Emp互相引用,在解析为json时部门包含员工,员工包含部门,部门包含员工。。。无限递归下去
使用到了fastjson依赖

fastjson依赖下载

public class Demo01 {
    public static void main(String[] args) {
        Dept dept = new Dept();
        dept.setName("研发部");

        Emp emp1=new Emp();
        emp1.setName("小明");
        emp1.setDept(dept);

        Emp emp2=new Emp();
        emp2.setName("小红");
        emp2.setDept(dept);

        dept.setEmps(Arrays.asList(emp1,emp2));
        System.out.println(JSON.toJSON(dept));
    }
}

class Emp {
    private String name;
    private Dept dept;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Dept getDept() {
        return dept;
    }
    public void setDept(Dept dept) {
        this.dept = dept;
    }
}

class Dept {
    private String name;
    private List<Emp> emps;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public List<Emp> getEmps() {
        return emps;
    }
    public void setEmps(List<Emp> emps) {
        this.emps = emps;
    }
}

在这里插入图片描述

以上情况无法通过增大栈内存解决,应避免,针对以上方法调用自身应设置出口,员工中不应出现部门引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值