单例崩溃 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()
时)。但是下次访问它时可能不会设置布尔值。
我上周发布了我的第一个 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()
时)。但是下次访问它时可能不会设置布尔值。