编译好:
static final Screen screen = Screen.getInstance();
static final InputListener listener = InputListener.getInstance();
static
{
screen.addListener(listener);
screen.setCurrentState(new MainMenu());
screen.setVisible(true);
}
private GameManager(){
mobs = new ArrayList<Mobile>();
player = new Player(100, 100);
mobs.add(player);
}
这不是:
static final Screen screen = Screen.getInstance();
static final InputListener listener = InputListener.getInstance();
private GameManager(){
mobs = new ArrayList<Mobile>();
player = new Player(100, 100);
mobs.add(player);
screen.addListener(listener);
screen.setCurrentState(new MainMenu());
screen.setVisible(true);
}
抛出:线程“main”中的异常java.lang.ExceptionInInitializerError说:
Caused by: java.lang.NullPointerException
at main.pack.minerdude.GameManager.<init>(GameManager.java:42)
at main.pack.minerdude.GameManager.<clinit>(GameManager.java:10)
... 1 more
第10行是:
private static final GameManager manager = new GameManager();
第42行指的是“回归经理”:
public static GameManager getInstance(){
return manager;
}
如果在创建暴徒并向其添加玩家后生成静态块,为什么表现得如此?
因此,在执行此代码并获得以下输出后,这是我的结论:
GameManager constructor
Screen constructor
Screen getInstance
static of GameManager
GameManager GetInstance
某些类需要GameManager对象,因此要返回它必须先创建它。
GameManager将Screen对象声明为static,并且具有与第一步相同的requeriments。
创建了屏幕get,因此GameManager初始化了静态对象并继续初始化以下静态。
现在GameManager已经完全初始化,它会将自己返回给第一个来电者。
人们会认为,当GameManager getInstnace被调用时,在调用它的构造函数之前,它会首先初始化它的所有静态,但是它似乎不会像在构造函数在其任何静态之前被调用那样工作。如果我直接创建一个新的GameManager - 而不是使用getInstance() - 则保留顺序:静态,变量,构造函数然后返回。
答案 0 :(得分:2)
您的问题是您在构造函数静态对象中使用,这取决于您的构造函数。
您的计划流程为:
1. static final Screen screen = Screen.getInstance();
2. public static GameManager getInstance(){ return manager;}
3. private static final GameManager manager = new GameManager();
4. private GameManager(){
//......
screen.addListener(listener);
//but screen is still null !!! NullPointerException !!!
}