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)
你的单例没有任何问题。不存在并发问题,因为这不是多线程代码。
你以为s是空的,但实际上那是i空的。
由于addToLevel采用 anint作为参数,因此Integer i被自动拆箱(从 隐式转换为Integer)int,但由于iwas null,NullPointerException被抛出。NullPointerException当被转换的值为 时,自动拆箱会抛出异常null。
Integer.getInteger(Singleton.K_LEVEL)返回的原因null是因为您执行了java A -Dlevel=1与 . 相反的操作java -Dlevel=1 A。后者是正确的语法。
| 归档时间: |
|
| 查看次数: |
3583 次 |
| 最近记录: |