调用moveToFirst()时抛出NullPointerException的游标

时间:2015-05-15 14:26:02

标签: java android nullpointerexception cursor

我最近在Play商店发布了崩溃报告,如下所示:

java.lang.NullPointerException
    at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:144)
    at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133)
    at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:196)
    at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:236)
    at com.myapp.MyActivity(MyActivity.java:283)
    at java.lang.Thread.run(Thread.java:856)

起初我以为是光标为空,但不能是因为我在调用moveToFirst()之前检查它是否为空

mCursor = getCursorData();

if (mCursor != null)
    mCursor.moveToFirst(); // Line 283

有人可以告诉我它崩溃的原因吗?

编辑:

上面的代码几乎就在它内部的方法的开头。这是在onConfigurationChanged()内运行的,所以我可以用光标中的新集更新活动的标签。

getCursorData()是我SQLiteOpenHelper内的一种方法: 我使用rawQuery的原因是由于使用INNER JOIN的实际查询。查询本身很好,因为它可以完美地工作几年而不会抛出这个异常。

public Cursor getCursorData(long userformid) {
    SQLiteDatabase db = getWritableDatabase();

    return db.rawQuery("SELECT * FROM table WHERE _id=?", new String[]{
        String.valueOf(id)
    });
}

我现在更改了我的代码,在调用getCount()之前检查moveToFirst()。我只是在等待有问题的用户更新到这个新版本以查看它是否有效。

3 个答案:

答案 0 :(得分:3)

您应首先检查数据的计数,因此请使用:

if(mCursor!=null && mCursor.getCount()>0 ){
    mCursor.moveToFirst();
}

答案 1 :(得分:1)

它不是mCursor,而是mCursor内的null。根据您的fillWindow,它恰好位于144stack trace内。

通常这种NPE是由于没有正确初始化对象。在您进行inovke mCursor.moveFirst()之前,请确保mCursor有足够的详细信息或数据来处理您的方法调用。

答案 2 :(得分:0)

重要的是要从文档中注意Cursor.moveToFirst()将返回一个布尔值。该布尔值表示移动是否成功。

不是检查游标是否为空,或者它是否至少有一行,只需检查该操作的返回值:

if(mCursor.moveToFirst()){
   // Do something, we have success!
} else{
   // Ignore, or show toast to let user know something failed, 
   // whatever your business rule is.
}