java - 我无法理解的 ExceptionInInitializerError

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

如果在创建生物并向其中添加玩家后生成静态 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/

相关文章:

java - 耶拿自定义数据类型

java - 不同类的 GET 类方法未调用并获取 Umbrella 异常

iphone - 如何创建 iPhone 框架并在其他 iPhone 应用程序中使用它

java - 如果 JTextField 不包含数据,则显示消息对话框

java - 通过组件构造函数 Autowiring 静态成员

asp.net-mvc - Moq Roles.AddUserToRole 测试

Java - 向游戏添加控件的最佳方式

java - Java 是否支持和优化尾递归调用?

java - TextArea 上的断线

java - 调用方法时的异常处理