null对象引用 - 与Java中的Objects混淆

时间:2018-02-21 06:11:51

标签: java object constructor

我对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)
...

非常感谢。

2 个答案:

答案 0 :(得分:0)

此行引发了您的异常:String answer = allQuizQuestions.definition;,这意味着allQuizQuestionsnull。因此,在上面的行(DatabaseB.QObject allQuizQuestions = quizobject.getAnswer(message);)中,您可以从null方法获得getAnswer(message)。如果cursor.moveToFirst()返回false并且您从未调用此行代码,则会发生这种情况:quizObject = new QObject(word, definition);

我发现还有一件事:此行quizObject = new QObject(word, definition);中的构造函数不使用您在数据库中找到的字符串,而是使用来自word类的definitionQObject的值,此时为空。您应该使用mywordmydefinition代替。

答案 1 :(得分:-1)

您可以使用行号发布代码(如果您在eclipse上右键单击编辑器的最左侧并选择'显示行号')。看起来你正在调用一个null的对象上的方法。你晚上需要在方法调用之前进行空检查