Java 调用moveToFirst()时引发NullPointerException的游标
我最近收到一份关于Play Store的崩溃报告,该报告如下所示:Java 调用moveToFirst()时引发NullPointerException的游标,java,android,nullpointerexception,cursor,Java,Android,Nullpointerexception,Cursor,我最近收到一份关于Play Store的崩溃报告,该报告如下所示: java.lang.NullPointerException at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:144) at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133) at android.database.Abstrac
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()
有人能告诉我为什么它会坠毁吗
编辑:
上面的代码基本上是它所包含的方法的开头。这是在onConfigurationChanged()
中运行的,因此我可以使用光标上的新设置更新活动上的选项卡
getCursorData()
是我的SQLiteOpenHelper
中的一个方法:
我之所以使用rawQuery,是因为实际的查询使用了内部联接。查询本身是很好的,因为它在几年内工作得非常完美,没有抛出这个异常
public Cursor getCursorData(long userformid) {
SQLiteDatabase db = getWritableDatabase();
return db.rawQuery("SELECT * FROM table WHERE _id=?", new String[]{
String.valueOf(id)
});
}
在调用
moveToFirst()
之前,我已经将代码更改为checkgetCount()
。我正在等待出现问题的用户更新到此新版本,以查看它是否有效。您应该首先检查数据计数,因此请使用以下方法:
if(mCursor!=null && mCursor.getCount()>0 ){
mCursor.moveToFirst();
}
您应该首先检查数据的计数,因此使用以下方法:
if(mCursor!=null && mCursor.getCount()>0 ){
mCursor.moveToFirst();
}
它不是
mCursor
,而是mCursor
内部的某种东西,即null
。根据您的堆栈跟踪
,它正好位于fillWindow
第144行的
通常这种NPE是由于没有正确初始化对象造成的。在inovkemCursor.moveFirst()
之前,请确保mCursor
具有足够的详细信息或数据来处理方法调用。不是mCursor
,而是mCursor
中的null
。根据您的堆栈跟踪
,它正好位于fillWindow
第144行的
通常这种NPE是由于没有正确初始化对象造成的。在inovkemCursor.moveFirst()
之前,请确保mCursor
具有足够的详细信息或数据来处理方法调用。重要的是要注意文档中返回的布尔值。该布尔值表示移动是否成功
与其检查光标是否为null,或者是否至少有一行,不如检查该操作的返回值:
if(mCursor.moveToFirst()){
// Do something, we have success!
} else{
// Ignore, or show toast to let user know something failed,
// whatever your business rule is.
}
请务必注意,文档中会返回布尔值。该布尔值表示移动是否成功
与其检查光标是否为null,或者是否至少有一行,不如检查该操作的返回值:
if(mCursor.moveToFirst()){
// Do something, we have success!
} else{
// Ignore, or show toast to let user know something failed,
// whatever your business rule is.
}
请发布完整的堆栈跟踪。这应该是一个链式异常,也许第283行的整个方法MyActivity
highlightedDid您是否知道这是什么原因?@McAdam331-还没有,它只发生在一个用户身上,我自己无法复制。@Kon-这是我在Play Store上收到的整个堆栈跟踪。第283行是.moveToFirst()调用。稍后我会尝试用相关代码更新问题。请发布完整的堆栈跟踪。这应该是一个链式异常,也许第283行的整个方法MyActivity
highlightedDid您是否知道这是什么原因?@McAdam331-还没有,它只发生在一个用户身上,我自己无法复制。@Kon-这是我在Play Store上收到的整个堆栈跟踪。第283行是.moveToFirst()调用。稍后我会尝试用相关代码更新这个问题。我会尝试一下,看看它是否会在我的下一版本中停止。我不知道moveToFirst()会抛出异常。我将尝试一下,看看它是否会在我的下一版本中停止。我不知道moveToFirst()会抛出异常。问题是调用moveToFirst()是导致崩溃的原因。@Mike Hm,即使在if语句中也是如此?真奇怪。是否可以显示您在getCursorData()中的操作?我们可能有一些见解。问题是调用moveToFirst()是导致崩溃的原因。@Mike Hm,即使在if语句中也是如此?真奇怪。是否可以显示您在getCursorData()中的操作?我们可能有一些见解。你的意思是像Gabriella上面建议的那样使用getCount()?你的意思是像Gabriella上面建议的那样使用getCount()?