0

有时我会收到来自谷歌的随机崩溃报告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会发生这种情况,并且当应用程序休眠片刻时显然会发生崩溃(请参阅上面的反馈)。


一位用户的反馈:

所以,主要是如果我离开应用程序而不退出它,当我尝试返回它时,应用程序经常会崩溃。有时我只是被送回菜单,但主要是完全退出应用程序,我必须重新启动它才能继续。

4

1 回答 1

0

我怀疑当应用程序最小化一段时间然后重新打开时会发生这种情况。如果感觉需要内存,Android 可以并且会从堆中删除对象。特别是静态变量可以被删除。在访问静态变量之前检查它们是否为空。

例如,在您的DatabaseManager类中,在getInstance()方法中而不是在中创建实例init()

public static DatabaseManager getInstance() {
    if(instance == null) instance = new DatabaseManager();
    return instance;
}

编辑:
请注意,我在这个答案中的推理是错误的。请阅读所有评论以进行澄清。

于 2013-04-17T17:26:12.980 回答