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;
}

mobを作成してプレーヤーを追加した後に静的ブロックが生成された場合、なぜそのように動作するのですか?

編集

したがって、これは、このコードを実行して次の出力を取得した後の私の結論です。

GameManager constructor
Screen constructor
Screen getInstance
static of GameManager
GameManager GetInstance
  1. 一部のクラスはGameManagerオブジェクトを必要としているため、それを返すには、最初に作成する必要があります。

  2. GameManagerには静的と宣言されたScreenオブジェクトがあり、最初のステップと同じ要件があります。

  3. Screen getが作成されるため、GameManagerは静的オブジェクトを初期化し、次の静的オブジェクトの初期化を続行します。

  4. GameManagerが完全に初期化されたので、最初の呼び出し元に戻ります。

GameManager getInstnaceが呼び出されると、コンストラクターを呼び出す前に、最初にすべての静的なものが初期化されると想定されますが、コンストラクターが静的なものの前に呼び出されるため、そのようには機能しないようです。getInstance()を使用せずに新しいGameManagerを直接作成すると、順序は保持されます。つまり、静的、変数、コンストラクターが返されます。

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 に答える