报错笔记:java.lang.StackOverflowError java.lang.ExceptionInInitializerError Java单例模式报错笔记

报错描述

简单记录一个在使用单例模式时因为架构设计而报的错

因为代码过多,我用A和B两个类还原了一下,使用的是饿汉式单例

class A {

    private static A INSTANCE = new A();

    public static A getInstance(){
        return INSTANCE;
    }

    private A(){
        new B();
    }

    public void m(){
        System.out.println("m");
    }
}

class B{
    public B(){
        A.getInstance().m();
    }
}

main方法

    public static void main(String[] args) {
        new B();
        System.out.println("ok");
    }

报错原因很明显,是因为创建B时需要A的单例,但是A的单例初始化又需要B,成了死循环

解决办法

我们可以回顾一下类的创建过程,在构造方法执行完后会加载静态代码块

所以我们可以加一个init方法给我们的对象A,在A初始化完成后再通过静态代码块加载对象B

class A {

    private static A INSTANCE = new A();

    static {
        init();
    }

    private static void init(){
        new B();
    }

    public static A getInstance(){
        return INSTANCE;
    }

    private A(){

    }

    public void m(){
        System.out.println("m");
    }
}

class B{
    public B(){
        A.getInstance().m();
    }
}

main方法

 public static void main(String[] args) {
        new B();
        System.out.println("ok");
    }

输出结果
在这里插入图片描述
ok,问题解决!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值