我对Java中的对象和构造函数感到困惑。我从SQLiteDatabase查询但我无法获得正确的对象/答案。我知道我的代码看起来很乱,我需要清理它,但我不知道从哪里开始......
public static class QObject {
public String word;
public String definition;
public QObject(String word, String definition) {
this.word = word;
this.definition = definition;
}
public QObject getAnswer(String message) {
QObject quizObject = null;
String query = "select * from " + TABLE_NAME + " where " + COL_WORD + " = '" + message + "'";
Cursor cursor = this.getDbConnection().rawQuery(query, null);
if(cursor.moveToFirst()) {
do {
String myword = cursor.getString(cursor.getColumnIndexOrThrow(COL_WORD));
String mydefinition = cursor.getString(cursor.getColumnIndexOrThrow(COL_DEFINITION));
quizObject = new QObject(word, definition);
} while (cursor.moveToNext());
}
cursor.close();
return quizObject;
}
private SQLiteDatabase getDbConnection() {
return dbHelper.getReadableDatabase();
}
}
}
public void searchName(View view) {
String word = null;
String definition = null;
DatabaseTable db = new DatabaseTable(this);
DatabaseBackend dbBackend = new DatabaseBackend(MainActivity.this);
DatabaseObject dbo = new DatabaseObject(this);
DatabaseB.QObject quizobject = new DatabaseB.QObject(word, definition);
DatabaseB.QObject allQuizQuestions = quizobject.getAnswer(message);
String answer = allQuizQuestions.definition;
TextView textView = findViewById(R.id.textView2);
textView.setText(answer);
}
错误消息是空对象引用:
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
...
Caused by: java.lang.NullPointerException: Attempt to read from field 'java.lang.String com.justkitting.orion.databasetest.MainActivity$DatabaseB$QObject.definition' on a null object reference
at com.justkitting.orion.databasetest.MainActivity.searchName(MainActivity.java:139)
at java.lang.reflect.Method.invoke(Native Method)
...
非常感谢。
答案 0 :(得分:0)
此行引发了您的异常:String answer = allQuizQuestions.definition;
,这意味着allQuizQuestions
为null
。因此,在上面的行(DatabaseB.QObject allQuizQuestions = quizobject.getAnswer(message);
)中,您可以从null
方法获得getAnswer(message)
。如果cursor.moveToFirst()
返回false
并且您从未调用此行代码,则会发生这种情况:quizObject = new QObject(word, definition);
。
我发现还有一件事:此行quizObject = new QObject(word, definition);
中的构造函数不使用您在数据库中找到的字符串,而是使用来自word
类的definition
和QObject
的值,此时为空。您应该使用myword
和mydefinition
代替。
答案 1 :(得分:-1)
您可以使用行号发布代码(如果您在eclipse上右键单击编辑器的最左侧并选择'显示行号')。看起来你正在调用一个null的对象上的方法。你晚上需要在方法调用之前进行空检查