这样可以编译:

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/

10-08 23:59