调用 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
.
,它确实在 fillWindow
行 144
内
通常这种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.
}
我最近在 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
.
fillWindow
行 144
内
通常这种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.
}