Java Singleton.getInstance()返回null?
我尝试使用这个单例,但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
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_级别)返回null的代码>方法。我打赌“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 assystem.out.println(i)代码>就在s.addToLevel(i)之前代码>打印?
java A -Dlevel=1
java -Dlevel=1 A