如何消除错误以在空对象引用上调用接口方法“boolean android.database.Cursor.moveToFirst()”

问题描述

我有以下活动。

  1. User_info:我在其中编辑文本框以从 sqlite 获取用户数据并允许用户更改其数据。
  2. 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 ComponentInfo{nanodevlab.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);

解决方法

在方法 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});
}