调用 moveToFirst() 时光标抛出 NullPointerException

Cursor throwing NullPointerException when calling moveToFirst()

我最近在 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() 内的 运行,因此我可以使用光标中的新集更新 activity 上的选项卡。

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)
    });
}

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

你应该先检查数据的计数,所以使用这个:

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

不是 mCursor,而是 mCursor 里面的东西 null。根据您的 stack trace.

,它确实在 fillWindow144

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

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

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

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