如何删除错误以在空对象引用上调用接口方法“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)”

Android错误尝试在空对象引用上调用虚拟方法[重复]