これはうまくコンパイルされます:
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
一部のクラスはGameManagerオブジェクトを必要としているため、それを返すには、最初に作成する必要があります。
GameManagerには静的と宣言されたScreenオブジェクトがあり、最初のステップと同じ要件があります。
Screen getが作成されるため、GameManagerは静的オブジェクトを初期化し、次の静的オブジェクトの初期化を続行します。
GameManagerが完全に初期化されたので、最初の呼び出し元に戻ります。
GameManager getInstnaceが呼び出されると、コンストラクターを呼び出す前に、最初にすべての静的なものが初期化されると想定されますが、コンストラクターが静的なものの前に呼び出されるため、そのようには機能しないようです。getInstance()を使用せずに新しいGameManagerを直接作成すると、順序は保持されます。つまり、静的、変数、コンストラクターが返されます。