有时我会收到来自谷歌的随机NullPointerExceptions
导致的崩溃报告(见上文)。我试图重现那些错误,但我无法抓住它们。
我得到的NPE示例:
Caused by: java.lang.NullPointerException
at com.gamequiz.databasemanager.CategoryManager.getAllCategories(CategoryManager.java:28)
Caused by: java.lang.NullPointerException
at com.gamequiz.databasemanager.QuestionManager.getQuestionsFromLevel(QuestionManager.java:30)
at com.gamequiz.databasemanager.QuestionManager.getNumberOfQuestionAnsweredFromLevel(QuestionManager.java:148)
<小时/> 虽然我的
dbHelper
变量有时会null
,但我无法弄明白为什么。
由于我不知道如何解决这个问题,我发布了代码的所有步骤:
首先,我初始化LaunchActivity
中的所有经理:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_launch);
initializeAllManagers();
//some stuff
}
public void initializeAllManagers(){
InitializeAllManagers.init(getApplicationContext());
}
在我的InitializeAllManagers
课程中,我为应用的生命周期设置了所需的所有管理员:
public class InitializeAllManagers {
public static void init(Context context){
DatabaseManager.init(context);
CategoryManager.init(DatabaseManager.getInstance().getHelper());
//and others initializations
}
}
DatabaseManager
类(dbManager和dbHelper的初始化):
public class DatabaseManager {
private static DatabaseManager instance;
private DatabaseHelper helper;
public static void init(Context ctx) {
if (instance==null) {
instance = new DatabaseManager(ctx);
}
}
public static DatabaseManager getInstance() {
return instance;
}
private DatabaseManager(Context ctx) {
helper = new DatabaseHelper(ctx);
}
public DatabaseHelper getHelper() {
return helper;
}
}
最后有一个经理的例子:
public class CategoryManager {
private static DatabaseHelper dbHelper;
public static void init(DatabaseHelper dbHelperInstance) {
dbHelper = dbHelperInstance;
}
public static ArrayList <Category> getAllCategories(){
ArrayList <Category> cList = null;
try {
cList = (ArrayList<Category>) dbHelper.getCategoryDao().queryForAll();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return cList;
}
}
所以我怀疑我的dbHelper
变量有时是null
。有没有人知道如何解决这个问题?
编辑:
NPE主要指这一行:
cList = (ArrayList<Category>) dbHelper.getCategoryDao().queryForAll();
Dao <Question, Long> questionDao = dbHelper.getQuestionDao();
这就是为什么我怀疑dbHelper
有时是null
,显然当应用程序暂停一段时间时会发生崩溃(请参阅上面的反馈)。
<小时/> 一位用户的反馈:
所以,主要是如果我离开应用程序而不退出它,应用程序将经常 当我试图回到它时崩溃。有时候我会被送回去 菜单,但大多数只是从应用程序的所有方式,我必须 重新启动它以继续。
答案 0 :(得分:0)
我怀疑当应用程序最小化一段时间然后重新打开时会发生这种情况。如果感觉需要内存,Android可以并将从堆中删除对象。特别是静态变量可以被删除。在访问静态变量之前检查它们是否为null。
例如,在DatabaseManager
课程中,使用getInstance()
方法而不是init()
创建实例。
public static DatabaseManager getInstance() {
if(instance == null) instance = new DatabaseManager();
return instance;
}
修改强>
请注意,我在这个答案中的推理是错误的。请阅读所有评论以获得澄清。