“尝试在空对象引用和三滴哦i阿勇虚拟方法”这个错误到底在哪,或者说这个我问题一般都会因为什么出现的

我的设计是想要在主程序中运用实例化的SQLiteOpenHeper中的查询功能,然后返回一个List给主程序,主程序接到传来的List后转化为一个二维数组,然后可以将里面的内容分开展示。
但是我在运行的时候,就一直在闪退,我看了debug,说我“尝试在空对象引用上调用虚拟方法”,我实在是找不到哪里有问题了,恳请大家们帮我看看。

这是是查询:

public List<Card2> sQuery(){
        Card2 card;
        List<Card2> list = new ArrayList<>();
        String sql = "SELECT * FROM "+TABLE_NAME+" WHERE "+WEIGHT+" =5";
        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
        Cursor cursor = sqLiteDatabase.rawQuery(sql, null);
        int idIndex = cursor.getColumnIndex(ID);
        int questionIndex = cursor.getColumnIndex(QUESTION);
        int answerIndex = cursor.getColumnIndex(ANSWER);
        int weightIndex = cursor.getColumnIndex(WEIGHT);
        while (cursor.moveToNext()){
            card = new Card2(cursor.getInt(idIndex),cursor.getString(questionIndex),cursor.getString(answerIndex),cursor.getInt(weightIndex));
            list.add(card);
        }
        cursor.close();
        sqLiteDatabase.close();

        return list;
    }

这个是主程序引入

List<Card2> list = new ArrayList<>();
        list = db.sQuery();//老是说我这里有问题
        String[][] str = list.toArray(new String[0][]);
        tvq.setText(str[i][1]);
        tva.setText(str[i][2]);

这是debug中标出的bug

img

还有一个就是我自定义的一个类

这是类里面定义的变量(是这么叫吧我不记得了

    private Integer id;
    private String question;
    private String answer;
    private Integer weight;

还有一点有问题的是下面的set有两个是灰色的,但是我看不出来哪里有问题

img

这个问题我找了半天了,实在是能力不够
;(

根据你提供的信息看,具体的错误是说:java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List com.skypen.mycard.MyDataHelper.sQuery()' on a null object reference ,意思就是你在一个空的对象引用上调用虚拟方法,因此,解决方法就是,检查 list = db.sQuery();这里的这个db对象是否为空,有没有初始化db对象:

db = new MyDataHelper()

如果你已经初始化了db对象,还是这个错误,你可以加一个判断:
if db!=null{
list = db.sQuery()
}
或者调试程序看看

引用chatGPT作答,这个错误提示“尝试在空对象引用上调用虚拟方法”通常发生在你试图调用一个对象的方法或访问其属性时,而这个对象为空(即 null)的情况下。这很可能是因为在你的代码中使用了未初始化或未赋值的对象,或者是在使用对象之前已经被销毁了。这种错误通常在编译时无法检测到,而是在运行时才会出现。

根据你提供的代码片段,我注意到以下几个可能导致该错误的问题:

1.在 list = db.sQuery(); 这行代码之前,你没有初始化 db 对象。请确保你已经实例化了 db,并且其值不为 null,否则调用 sQuery() 方法时就会产生空对象引用。

2.在 String[][] str = list.toArray(new String[0][]); 这行代码中,你将 List 类型的 list 转换成了 String[][] 类型的 str。这种类型转换可能会产生类型不匹配的问题。你应该使用 Card2[][] 类型来接收 list。

3.在你的自定义类 Card2 中,你没有为其属性提供任何 setter 方法,这可能导致在使用时出现问题。请确保为类中的每个属性都提供了相应的 getter 和 setter 方法,并在需要时正确地使用它们。

希望这些提示对你有所帮助!

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这个错误通常发生在您试图在空对象上调用一个方法时。从您的代码和调试信息来看,可能的原因是在以下代码的主程序中:

List<Card2> list = new ArrayList<>();
list = db.sQuery();
String[][] str = list.toArray(new String[0][]);
tvq.setText(str[i][1]);
tva.setText(str[i][2]);

您已声明并实例化了一个空的ArrayList,然后调用了sQuery()方法填充它。但是,如果sQuery()方法返回空值或list并没有正确填充,那么在尝试将其转换为二维数组时,您将得到空对象引用错误。

您可以在主程序中添加一些代码来检查sQuery()方法是否返回了正确的值。例如:

List<Card2> list = db.sQuery();
if (list != null && !list.isEmpty()) {
    String[][] str = list.toArray(new String[0][]);
    tvq.setText(str[i][1]);
    tva.setText(str[i][2]);
} else {
    // handle the case where sQuery() returns null or an empty list
}

关于类的问题,灰色的setter方法是因为它们没有被使用。您可以通过在类中使用它们来将相应的变量设置为新的值。例如:

Card2 card = new Card2(1, "What is the capital of France?", "Paris", 5);
card.setId(2); // set the id to 2
card.setQuestion("What is the capital of England?"); // change the question
card.setWeight(7); // change the weight

如果我的回答解决了您的问题,请采纳!

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    对于这个问题,错误提示表明存在空对象引用调用虚拟方法,这通常意味着某个对象未被正确初始化或已被销毁。因此,您可能需要进一步检查您的代码,尤其是涉及到SQLiteOpenHelper实例化以及相关查询操作的部分。

    首先,您可以确保已经正确实例化了SQLiteOpenHelper并在查询操作之前进行了初始化。其次,您需要检查查询操作是否成功执行,并确保成功获取到结果。另外,查看您的自定义类是否正确定义,并确保它的所有变量都已被正确初始化。

    如果这些检查都没有解决问题,您可以尝试打印相关变量的值,以确定问题出在哪里。最后,您也可以使用调试器进行调试,进一步定位和解决问题。

    以下是一些参考代码,其中包含了一个查询数据的示例和一个自定义类的示例,希望能对解决您的问题有所帮助:

    // 示例查询代码
    public List<String> queryData(SQLiteOpenHelper dbHelper) {
        List<String> dataList = new ArrayList<>();
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT * FROM mytable", null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                String data = cursor.getString(cursor.getColumnIndex("data"));
                dataList.add(data);
            }
            cursor.close();
        }
        db.close();
        return dataList;
    }
    
    // 示例自定义类
    public class MyData {
        private int id;
        private String name;
    
        public MyData(int id, String name) {
            this.id = id;
            this.name = name;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
    // 当使用自定义类进行查询数据时的示例代码
    public List<MyData> queryData(SQLiteOpenHelper dbHelper) {
        List<MyData> dataList = new ArrayList<>();
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT * FROM mytable", null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                int id = cursor.getInt(cursor.getColumnIndex("id"));
                String name = cursor.getString(cursor.getColumnIndex("name"));
                MyData data = new MyData(id, name);
                dataList.add(data);
            }
            cursor.close();
        }
        db.close();
        return dataList;
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^