Android 尝试访问数据时尝试调用虚拟方法错误

Android 尝试访问数据时尝试调用虚拟方法错误,android,Android,我是android世界的新手,当我试图从数据库获取数据时,我遇到了这个错误,下面是我的数据库访问代码 public static boolean Checkduplicate(String activity_name, String location, String date) { SQLiteDatabase dtb = ActivityHandler.db; String Query = "Select * from Activity where activity_nam

我是android世界的新手,当我试图从数据库获取数据时,我遇到了这个错误,下面是我的数据库访问代码

public static boolean Checkduplicate(String activity_name, String location, String date) {
    SQLiteDatabase dtb = ActivityHandler.db;
    String Query = "Select * from  Activity  where activity_name = " + activity_name + "and location =" + location + "and _date =" + date;
    Cursor cursor = dtb.rawQuery(Query, null);
    if(cursor.getCount() <= 0){
        cursor.close();
        return true;
    }
    cursor.close();
    return false;
}
这是我的完整ActivityHandler类

public class ActivityHandler {
private static SQLiteDatabase db;
public  ActivityHandler(Context context){
    DatabaseHandler dbDatabaseHandler = new DatabaseHandler(context);
    this.db = dbDatabaseHandler.getWritableDatabase();
}

@Override
protected void finalize() throws Throwable {
    try{
        db.close();
    }catch (Exception ex){

    }
    super.finalize();
}

public static boolean Checkduplicate(String activity_name, String location, String date) {
    SQLiteDatabase dtb = ActivityHandler.db;
    String Query = "Select * from  Activity  where activity_name = " + activity_name + "and location =" + location + "and _date =" + date;
    Cursor cursor = dtb.rawQuery(Query, null);
    if(cursor.getCount() <= 0){
        cursor.close();
        return true;
    }
    cursor.close();
    return false;
}
公共类ActivityHandler{
私有静态数据库;
公共活动处理程序(上下文){
DatabaseHandler dbDatabaseHandler=新的DatabaseHandler(上下文);
this.db=dbDatabaseHandler.getWritableDatabase();
}
@凌驾
受保护的void finalize()抛出可丢弃的{
试一试{
db.close();
}捕获(例外情况除外){
}
super.finalize();
}
公共静态布尔检查重复(字符串活动名称、字符串位置、字符串日期){
SQLiteDatabase dtb=ActivityHandler.db;
String Query=“从活动中选择*,其中活动名称=“+Activity\u name+”和位置=“+location+”和日期=“+date”;
Cursor Cursor=dtb.rawQuery(查询,空);

if(cursor.getCount()您需要了解
静态
的含义以及Java垃圾收集器的工作原理。 您正在为对象构造函数中的
static
属性赋值。这意味着两件事:
1) 您需要首先创建ActivityHandler的对象。它将使用值初始化属性
db

2) 您需要在某处保留对此对象的引用。如果您不保留引用,对象将被垃圾收集,这将调用
finalize()
并关闭数据库。

我建议如下:
1) 删除关键字
static
,并将ActivityHandler的对象传递给方法

2) 仔细阅读一些基本的Java书籍,如核心Java、有效Java等。

我认为您应该删除static并编写此=>

public class ActivityHandler {
private SQLiteDatabase db;
public ActivityHandler(Context context){
    DatabaseHandler dbDatabaseHandler = new DatabaseHandler(context);
    this.db = dbDatabaseHandler.getWritableDatabase();
}

@Override
protected void finalize() throws Throwable {
    try{
        db.close();
    }catch (Exception ex){

    }
    super.finalize();
}

public boolean Checkduplicate(String activity_name, String location, String date) {
    SQLiteDatabase dtb = ActivityHandler.db;
    String Query = "Select * from  Activity  where activity_name = " + activity_name + "and location =" + location + "and _date =" + date;
    Cursor cursor = dtb.rawQuery(Query, null);
    if(cursor.getCount() <= 0){
        cursor.close();
        return true;
    }
    cursor.close();
    return false;
}

我已经读过这个主题,但找不到我的案例的解决方案我不擅长java,但似乎
dtb
null
,可能是因为
ActivityHandler.db
也是
null
。重复的内容适用。只要读一下错误消息。@Jean Françoisfare我也不擅长java,但如果dtb是null,那不是r在“dtb.rawQuery”行中断后,调试器检查立即显示错误?您提到的那一行是导致错误的那一行。在null对象上调用方法。您对java的吮吸比我的更大:)但是如果我删除static关键字,我无法在另一个类中调用该方法。是的,您可以。您必须创建Ac的新实例tivityHandler,然后从此实例调用Checkduplicate。
public class ActivityHandler {
private SQLiteDatabase db;
public ActivityHandler(Context context){
    DatabaseHandler dbDatabaseHandler = new DatabaseHandler(context);
    this.db = dbDatabaseHandler.getWritableDatabase();
}

@Override
protected void finalize() throws Throwable {
    try{
        db.close();
    }catch (Exception ex){

    }
    super.finalize();
}

public boolean Checkduplicate(String activity_name, String location, String date) {
    SQLiteDatabase dtb = ActivityHandler.db;
    String Query = "Select * from  Activity  where activity_name = " + activity_name + "and location =" + location + "and _date =" + date;
    Cursor cursor = dtb.rawQuery(Query, null);
    if(cursor.getCount() <= 0){
        cursor.close();
        return true;
    }
    cursor.close();
    return false;
}
ActivityHandler activityHandler = new ActivityHandler(context);
boolean isDuplicate = activityHandler.Checkduplicate(activity_name,location, date);