Android - 随机NullPointerException崩溃报告

时间:2013-04-17 17:12:27

标签: java android nullpointerexception ormlite

有时我会收到来自谷歌的随机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,显然当应用程序暂停一段时间时会发生崩溃(请参阅上面的反馈)。

<小时/> 一位用户的反馈:

  

所以,主要是如果我离开应用程序而不退出它,应用程序将经常   当我试图回到它时崩溃。有时候我会被送回去   菜单,但大多数只是从应用程序的所有方式,我必须   重新启动它以继续。

1 个答案:

答案 0 :(得分:0)

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

例如,在DatabaseManager课程中,使用getInstance()方法而不是init()创建实例。

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

修改
请注意,我在这个答案中的推理是错误的。请阅读所有评论以获得澄清。