单例崩溃 Class

Crash with Singleton Class

我上周发布了我的第一个 Android 应用程序。 Google Dev Console 中报告了一些崩溃。

其中一个 java.lang.RuntimeException 是由以下行的 java.lang.NullPointerException 引起的:

mNoJokersGameVersion = GameData.getInstance().ismNoJokersGameVersion();

class GameData 实现为单例:

public class GameData {

private Boolean mNoJokersGameVersion;

private static GameData mInstance = null;

//Constructor is private because GameData class is a singleton
private GameData() {
    mNoJokersGameVersion = null; 
}

//(Only) This function gives access to the singleton GameData
public static GameData getInstance() {
    if (mInstance == null) {
        mInstance = new GameData();
    }
    return mInstance;
}

public Boolean ismNoJokersGameVersion() {
        return mNoJokersGameVersion;
}

public void setmNoJokersGameVersion(Boolean mNoJokersGameVersion) {
    if (this.mNoJokersGameVersion != null) {
        throw new IllegalStateException("mNoJokersGameVersion was already set");
    }
    this.mNoJokersGameVersion = mNoJokersGameVersion;
}

}

在创建第一个 Activity 时,使用从 .xml 配置文件中读取的值调用 setmNoJokersGameVersion:

Boolean jokers_version_off = Integer.valueOf(getValue("jokers", element2)) == 0;

GameData.getInstance().setmNoJokersGameVersion(jokers_version_off);

可能会出什么问题?

重要说明:崩溃发生过几次,但并非总是如此。垃圾收集器对此负责吗?

在 class GameData 中从布尔值切换到布尔值是否是一种可能的修复方法?

NullPointerException 指的是您的 Boolean 而不是单例实例。您将布尔值的初始值设置为 null,因此可能发生的情况是您的 GameData 已创建但布尔值尚未设置。更改为具有默认值的基本类型布尔值应该可以解决此问题。

可能导致这种情况的一种可能情况是例如方向改变。这将删除并使 GameData 对象无效,从而强制重新创建它(调用 getInstance() 时)。但是下次访问它时可能不会设置布尔值。