我最近在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()
。我只是在等待有问题的用户更新到这个新版本以查看它是否有效。
答案 0 :(得分:3)
您应首先检查数据的计数,因此请使用:
if(mCursor!=null && mCursor.getCount()>0 ){
mCursor.moveToFirst();
}
答案 1 :(得分:1)
它不是mCursor
,而是mCursor
内的null
。根据您的fillWindow
,它恰好位于144
行stack 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.
}