Java Singleton.getInstance()返回null?

Dog*_*Dog 7 java autoboxing singleton

我有这个单例我正在尝试使用,但getInstance显然可以返回null:

class Singleton {
    public static final String K_LEVEL = "level";
    static Singleton instance = new Singleton();
    private int level;

    static Singleton getInstance() {
        return instance;
    }

    int getLevel() {
        return level;
    }

    void incrementLevel() {
        System.out.println("LEVEL INCREASED TO " + ++level);
    }

    void addToLevel(int x) {
        for(int i=0;i<x;i++)
            incrementLevel();
    }

}

class A {
    public static void main(String[] args) {
        Singleton s = Singleton.getInstance();
        Integer i = Integer.getInteger(Singleton.K_LEVEL);
        s.addToLevel(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

我听说在Java中实现单例是非常困难并且容易出现竞争条件.我的单例模式是否实现错误?我最近改变了我的代码看起来像这样,现在getInstance有时会返回null.为什么?

$ java A -Dlevel=1
Exception in thread "main" java.lang.NullPointerException
    at A.main(A.java:29)
Run Code Online (Sandbox Code Playgroud)

Har*_*son 3

你的单例没有任何问题。不存在并发问题,因为这不是多线程代码。

你以为s是空的,但实际上那是i空的。

由于addToLevel采用 anint作为参数,因此Integer i被自动拆箱(从 隐式转换为Integerint,但由于iwas nullNullPointerException被抛出。NullPointerException当被转换的值为 时,自动拆箱会抛出异常null

Integer.getInteger(Singleton.K_LEVEL)返回的原因null是因为您执行了java A -Dlevel=1与 . 相反的操作java -Dlevel=1 A。后者是正确的语法。