我上周推出了我的第一个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类中从布尔值切换到布尔值是一种可能的解决办法吗?
答案 0 :(得分:1)
NullPointerException
指的是您的Boolean
,而不是单身实例。您将布尔值的初始值设置为null,因此可能发生的是您创建的GameData
但布尔值尚未设置。使用默认值更改为基本类型布尔值应解决此问题。
可能导致此问题的可能情况是例如方向更改。这将删除使GameData对象无效,从而强制重新创建它(当调用getInstance()
时)。但是下次访问时可能不会设置布尔值。