单身类崩溃

时间:2018-03-13 22:00:06

标签: android crash-reports

我上周推出了我的第一个Android应用程序。 Google Dev Console中报告了一些崩溃事件。

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

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

GameData类实现为Singleton:

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

可能出现什么问题?

重要说明:崩溃发生了几次,并非总是如此。垃圾收集者是否对此负责?

在GameData类中从布尔值切换到布尔值是一种可能的解决办法吗?

1 个答案:

答案 0 :(得分:1)

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

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