如何删除错误以在空对象引用上调用接口方法“boolean android.database.Cursor.moveToFirst()”
Posted
技术标签:
【中文标题】如何删除错误以在空对象引用上调用接口方法“boolean android.database.Cursor.moveToFirst()”【英文标题】:How to remove error to invoke interface method 'boolean android.database.Cursor.moveToFirst()'on a null object reference 【发布时间】:2021-08-31 13:14:58 【问题描述】:我有以下活动。
-
User_info:我在其中编辑文本框以从 SQlite 获取用户数据并允许用户更改他的数据。
User_confirmation:如果用户想修改他的个人信息,他需要去活动 User_info,但在去之前他必须重新输入他的电子邮件和密码。
这是 DBHelper 类中的一个函数,用于向 user_info 发送数据。
public Cursor getAllData(String email, String password)
SQLiteDatabase db = this.getWritableDatabase();
Cursor res=null;
if ( res.moveToFirst())
res = db.rawQuery("Select * from persons where email = ? and password = ?", new String[]email, password);
return res;
我收到此错误。
2021-06-15 15:18:52.264 26638-26638/nanodevlab.screens E/androidRuntime: FATAL EXCEPTION: main
Process: nanodevlab.screens, PID: 26638
java.lang.RuntimeException: Unable to start activity ComponentInfonanodevlab.screens/nanodevlab.screens.userconfirmation: java.lang.NullPointerException: Attempt to invoke interface method 'boolean android.database.Cursor.moveToFirst()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'boolean android.database.Cursor.moveToFirst()' on a null object reference
at nanodevlab.screens.DBHelper.getAllData(DBHelper.java:80)
at nanodevlab.screens.userconfirmation.onCreate(userconfirmation.java:36)
at android.app.Activity.performCreate(Activity.java:6975)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
2021-06-15 15:18:52.355 26638-26643/nanodevlab.screens I/zygote: JIT allocated 56KB for compiled code of void android.view.View.<init>(android.content.Context, android.util.AttributeSet, int, int)
这就是我调用 getAllData() 函数的方式。
Cursor c=DB.getAllData(emailid,pass);
int index = c.getColumnIndexOrThrow("username");
String firstName = c.getString(index);
【问题讨论】:
【参考方案1】:在方法getAllData()
中,您将res
设置为null
,然后尝试设置moveToFirst()
,这会引发错误。
不需要moveToFirst()
,因为getAllData()
的目的是返回光标而不是对其进行迭代。
您的代码可以简化为:
public Cursor getAllData(String email, String password)
SQLiteDatabase db = this.getWritableDatabase();
return db.rawQuery("Select * from persons where email = ? and password = ?", new String[]email, password);
【讨论】:
谢谢,但这对我不起作用。它说 Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0 @Hamna 你得到的错误不是我回答中的代码抛出的。在调用getAllData()
后抛出它。调试您的代码以检查哪一行引发了错误。
String firstName = c.getString(index);,这个
光标 c=DB.getAllData(emailid,pass); int index = c.getColumnIndexOrThrow("用户名"); String firstName = c.getString(index); index = c.getColumnIndexOrThrow("email");字符串电子邮件 = c.getString(index); index = c.getColumnIndexOrThrow("countrycode"); String countrycode = c.getString(index);
@Hamna 首先检查变量index
的值,如果不是>= 0,则表示表中没有username
列。如果它 >=0,那么游标可能不包含任何行,因为没有包含您用于运行查询的电子邮件和密码的行。以上是关于如何删除错误以在空对象引用上调用接口方法“boolean android.database.Cursor.moveToFirst()”的主要内容,如果未能解决你的问题,请参考以下文章
尝试在空对象引用上调用接口方法“java.lang.Object java.util.Map$Entry.getValue()”
原因:java.lang.NullPointerException:尝试在空对象引用上调用接口方法
NullPointerException 错误尝试在空对象引用上调用虚拟方法错误
java.lang.NullPointerException:尝试在空对象引用上调用接口方法“OnColorChangeListener.colorChanged(java.lang.String)”