gpt4 book ai didi

java - 我无法理解的 ExceptionInInitializerError

转载 作者:行者123 更新时间:2023-12-02 07:18:10 24 4
gpt4 key购买 nike

编译良好:

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

如果在创建生物并向其中添加玩家后生成静态 block ,为什么会有这样的行为?

编辑

所以,这是我执行这段代码并得到以下输出后的结论:

GameManager constructor
Screen constructor
Screen getInstance
static of GameManager
GameManager GetInstance
  1. 某些类需要一个 GameManager 对象,因此要返回它,必须首先创建它。

  2. GameManager 有一个声明为静态的 Screen 对象,并且具有与第一步相同的要求。

  3. 屏幕获取已创建,因此 GameManager 已初始化其静态对象,并继续初始化以下静态数据。

  4. 现在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com