0

这编译得很好:

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 对象,并且具有与第一步相同的要求。

  3. Screen get 已创建,因此 GameManager 已初始化其静态对象并继续初始化以下静态对象。

  4. 现在 GameManager 已完全初始化,它会将自身返回给第一个调用者。

有人会假设当 GameManager getInstnace 被调用时,在调用它的构造函数之前,它会首先初始化它的所有静态变量,但它似乎不起作用,因为构造函数在它的任何静态变量之前被调用。如果我直接创建一个新的 GameManager - 不使用 getInstance() - 然后将保留顺序:静态、变量、构造函数然后返回。

4

1 回答 1

3

您的问题是您在构造函数中使用静态对象,这取决于您的构造函数。

您的程序流程是:

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 !!!
}
于 2013-02-02T08:33:04.937 回答