我无法理解的ExceptionInInitializerError

时间:2013-02-02 08:07:47

标签: java exception static initialization

编译好:

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
  1. 某些类需要GameManager对象,因此要返回它必须先创建它。

  2. GameManager将Screen对象声明为static,并且具有与第一步相同的requeriments。

  3. 创建了屏幕get,因此GameManager初始化了静态对象并继续初始化以下静态。

  4. 现在GameManager已经完全初始化,它会将自己返回给第一个来电者。

  5. 人们会认为,当GameManager getInstnace被调用时,在调用它的构造函数之前,它会首先初始化它的所有静态,但是它似乎不会像在构造函数在其任何静态之前被调用那样工作。如果我直接创建一个新的GameManager - 而不是使用getInstance() - 则保留顺序:静态,变量,构造函数然后返回。

1 个答案:

答案 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 !!!
}