我的设计是想要在主程序中运用实例化的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
还有一个就是我自定义的一个类
这是类里面定义的变量(是这么叫吧我不记得了
private Integer id;
private String question;
private String answer;
private Integer weight;
还有一点有问题的是下面的set有两个是灰色的,但是我看不出来哪里有问题
这个问题我找了半天了,实在是能力不够
;(
根据你提供的信息看,具体的错误是说: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
如果我的回答解决了您的问题,请采纳!
不知道你这个问题是否已经解决, 如果还没有解决的话:对于这个问题,错误提示表明存在空对象引用调用虚拟方法,这通常意味着某个对象未被正确初始化或已被销毁。因此,您可能需要进一步检查您的代码,尤其是涉及到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;
}