Java Singleton.getInstance()返回null?

Java Singleton.getInstance()返回null?,java,singleton,autoboxing,Java,Singleton,Autoboxing,我尝试使用这个单例,但getInstance显然可以返回null: class Singleton { public static final String K_LEVEL = "level"; static Singleton instance = new Singleton(); private int level; static Singleton getInstance() { return instance; } in

我尝试使用这个单例,但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);
    }
}

这不是关于你的单身模式,我觉得很好。它是
Integer.getInteger(Singleton.K_级别)方法。我打赌
“level”
系统属性尚未设置,并且
为null

您需要在命令行中将
-Dlevel=1
放在
A
类之前。如果调试代码或打印系统属性,您将看到它为null

java -Dlevel=1 A
当您尝试将
null
传递到
addToLevel(intx)
中,并尝试将
null
自动取消装箱为
intx
时,您会得到一个NPE


作为一个旁白,如果这个类被多个线程使用,你应该考虑在<代码> > Stutelon 类中使用<代码> AtomicInteger /COD>。<> >代码> java -dLe==1 A < /代码>应该符合你的需要。


从中,语法是
java[options]类[argument…]
,并且
-Dlevel=1
被视为一个选项(请参见小节)。

静态单例实例=新单例()应该是最终的,以防止出现竞争状况。

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

您认为
s
为空,但实际上是
i
为空

由于
addToLevel
int
作为参数,因此
整数i
被自动取消绑定(从
Integer
隐式转换为
int
),但由于
i
null
,因此引发了
NullPointerException
。当被转换的值为
null
时,自动取消装箱将引发
NullPointerException


返回
Integer.getInteger(Singleton.K_LEVEL)
的原因是
java A-Dlevel=1
而不是
java-Dlevel=1 A
。后者是正确的语法。

不,我这样设置:
javaa-Dlevel=1
-D
必须在
A
class@Dog之前。我会调试你的代码或打印出系统属性来验证它。我同意@狗狗,你为什么不在打电话给addToLevel核实之前打印i呢。听起来你是在猜测。即使getInteger返回null,强制转换也应该将其设置为0。我不创建其他线程,但我不知道。。我想可能是VM在另一个线程上实例化了我的单例,这样就可以解释为什么s的值为null?不。这不是自动装箱的工作方式。您将获得NPE,因为您的系统属性设置不正确@Dog.What as
system.out.println(i)就在
s.addToLevel(i)之前打印?
java A -Dlevel=1
java -Dlevel=1 A