美文网首页
单例模式引发的空指针问题

单例模式引发的空指针问题

作者: 狒狒_94d7 | 来源:发表于2020-06-13 11:24 被阅读0次

最近工作中遇到过使用饿汉式单例导致的空指针异常,特此记录,加深印象。

问题复现

简化代码如下:

public class Singleton {
    private static Singleton instance = new Singleton();
    public static Singleton getInstance() {return instance;}
    private static final Properties config = System.getProperties();
    private String name = config.getProperty("name");
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static void main(String[] args)
    {
        System.out.println(Singleton.getInstance().getName());
    }
}

咋一看貌似没什么问题,运行发现抛出异常:
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException

原因分析

究其原因是类和类的实例的初始化顺序问题,一般情况下类的实例创建是在类初始化完成之后,所以类中定义的静态变量和常量的初始化后的值在类对象中肯定是能够访问到值的(即例子中的config),但是上面的例子中,在类的初始化过程中实例化了单例对象,所以单例对象的构造在类初始化完成之前,由于类的静态元素初始化顺序是代码定义的顺序,所以此时类的静态变量config还没有初始化,是默认值null,在构造方法中就抛空指针异常了。

修改方法

1.可以使用其他方式的单例模式,如懒汉式,或者使用静态内部类的饿汉式。
避免单例对象的构造在类初始化完成前触发。
2.将单例对象的创建放在所有静态变量、静态代码块最后。避免引用到未初始化的静态变量。
3.将name改成静态变量,这样会在config后再初始化。

相关文章

  • 单例模式引发的空指针问题

    最近工作中遇到过使用饿汉式单例导致的空指针异常,特此记录,加深印象。 问题复现 简化代码如下: 咋一看貌似没什么问...

  • iOS-单例的几种写法

    一、静态指针方式(单线程模式单例) 二、多线程加锁单例 三、单例的健壮性 由于水平有限,难免出现纰漏,如有问题还请...

  • C++设计模式之单例模式

    话题二:指针*与引用&的区别 单例模式 单例模式(Singleton Pattern)是设计模式最简单的形式之一,...

  • 常见的设计模式

    创建型模式 结构型模式 行为模式 单例模式 单例模式的优点 常见的五种单例模式实现方式 单例带来的问题 如何选择 ...

  • 单例模式

    2020.01.10 晚 22:01 问题 我们从下面3个问题去对单例模式进行探讨 为什么需要单例模式? 单例模式...

  • python面试题-2018.1.30

    问题:如何实现单例模式? 通过new方法来实现单例模式。 变体: 通过装饰器来实现单例模式 通过元类来创建单例模式...

  • Singleton 单例模式

    饿汉式单例模式 饿汉式单例模式 通过静态代码块增加异常处理 懒汉式单例模式 存在线程安全问题 懒汉式单例模式 解决...

  • 设计模式第二篇、单例设计模式

    目录1、什么是单例设计模式2、单例设计模式的简单实现3、单例设计模式面临的两个问题及其完整实现4、单例设计模式的应...

  • 关于spring加载实例对象

    spring加载对象 spring在加载对象的时候,是单例模式创建,所以该对象不允许外部的类调用,而报空指针 解决...

  • 设计模式

    设计模式简介 单例设计模式 问题:单例设计模式是什么?为什么要学它?怎么用它? 1.定义:单例模式(Singlet...

网友评论

      本文标题:单例模式引发的空指针问题

      本文链接:https://www.haomeiwen.com/subject/xblatktx.html