这样可以编译:
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);
}
抛出:线程“主”中的异常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;
}
如果在创建mob并向其中添加播放器后生成了静态块,为什么会有这种行为呢?
编辑
因此,这是执行此代码并获得以下输出之后的结论:
GameManager constructor
Screen constructor
Screen getInstance
static of GameManager
GameManager GetInstance
某些类需要GameManager对象,因此要返回它,必须先创建它。
GameManager具有一个声明为static的Screen对象,并具有与第一步相同的要求。
屏幕获取已创建,因此GameManager对其静态对象进行了初始化,并继续初始化以下静态对象。
现在已经完全初始化了GameManager,它会将自己返回给第一个调用者。
可以假设当GameManager getInstnace被调用时,在调用它的构造函数之前,它将首先初始化它的所有静态变量,但是似乎不起作用,因为构造函数在任何静态变量之前被调用。如果我直接创建一个新的GameManager(不使用getInstance()),则会保留顺序:静态,变量,构造函数,然后返回。
最佳答案
您的问题是您在依赖于构造函数的构造函数静态对象内使用。
您的程序流程为:
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 !!!
}
关于java - 我不明白的ExceptionInInitializerError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14659953/