Android Studio Null объект Ссылка - PullRequest
2 голосов
/ 27 февраля 2020

Создание тестового приложения для вопросов / ответов, которое оценивает вас в зависимости от того, сколько попыток потребовалось, чтобы сделать это правильно (т.е. с первой попытки 5 баллов, 2-й попытки 4 балла ... и т. Д.) вопросы хранятся в файле .DB в папке ресурсов, и после тестирования логи оценки c я сейчас пытаюсь извлечь из базы данных.

это DatabaseOpener

package com.example.teambasedlearningapp;

import android.content.Context;
import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;

public class DatabaseOpenHelper extends SQLiteAssetHelper {
  private static final String DATABASE_NAME = "TBLData.db";
  private static final int DATABASE_VERSION = 1;

public DatabaseOpenHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
   }
}

это DatabaseAccessor

package com.example.teambasedlearningapp;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.ArrayList;
import java.util.List;

public class DatabaseAccess {
    private SQLiteOpenHelper openHelper;
    private SQLiteDatabase database;
    private static DatabaseAccess instance;

    /**
     *      * Private constructor to aboid object creation from outside classes.
     *      *
     *      * @param context
     *      
     */
    public DatabaseAccess(Context context) {
        this.openHelper = new DatabaseOpenHelper(context);
    }

    /**
     *      * Return a singleton instance of DatabaseAccess.
     *      *
     *      * @param context the Context
     *      * @return the instance of DabaseAccess
     *      
     */
    public static DatabaseAccess getInstance(Context context) {
        if (instance == null) {
            instance = new DatabaseAccess(context);
        }
        return instance;
    }

    /**
     *      * Open the database connection.
     *      
     */
    public void open() {
        this.database = openHelper.getWritableDatabase();
    }

    /**
     *      * Close the database connection.
     *      
     */
    public void close() {
        if (database != null) {
            this.database.close();
        }
    }

    /**
     *      * Read all modules from the database.
     *      *
     *      * @return a List of modules
     *      
     */
    public ArrayList<String> getModules() {
        ArrayList<String> list = new ArrayList<>();
        Cursor cursor = database.rawQuery("SELECT moduleName FROM Module", null);
        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            list.add(cursor.getString(0));
            cursor.moveToNext();
        }
        cursor.close();
        return list;
    }

    public ArrayList<String> getQuestions() {
        ArrayList<String> list = new ArrayList<>();
        Cursor cursor = database.rawQuery("SELECT question FROM Question ", null);
        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            list.add(cursor.getString(0));
            cursor.moveToNext();
        }
        cursor.close();
        return list;
    }
}

и главная страница вопроса, которая отвечает на вопрос

package com.example.teambasedlearningapp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.*;

public class GroupAnswering extends AppCompatActivity implements View.OnClickListener{
    private TextView question;
    private TextView message;
    private Button option1;
    private Button option2;
    private Button option3;
    private Button option4;
    private Button next;
    static ArrayList<String> questions2 = new ArrayList<String>();
    static int overall = 0;
    String answer = "Red";
    int grade = 4;
    String question22= questionGet();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_group_answering);

        question = (TextView) findViewById(R.id.question);
        message = (TextView) findViewById(R.id.message);
        option1 = (Button) findViewById(R.id.option1);
        option2 = (Button) findViewById(R.id.option2);
        option3 = (Button) findViewById(R.id.option3);
        option4 = (Button) findViewById(R.id.option4);
        next = (Button) findViewById(R.id.next);

        option1.setOnClickListener(this);
        option2.setOnClickListener(this);
        option3.setOnClickListener(this);
        option4.setOnClickListener(this);
        next.setOnClickListener(this);

        questions2.add(question2);

        question.setText(questions22.get(0));
        next.setVisibility(View.GONE);
    }
    public void onClick(View v){

        if (v.getId() == option1.getId()) {
            int gradef = Score(grade,"Red",answer);
        }
        else if (v.getId() == option2.getId()) {
            int gradef = Score(grade,"Blue",answer);
        }
        else if (v.getId() == option3.getId()) {
            int gradef = Score(grade,"Black",answer);
        }
        else if (v.getId() == option4.getId()) {
            int gradef = Score(grade,"White",answer);
        }
        else if (v.getId() == next.getId()) {
            openActivity2();
        }
    }
    public int Score (int score, String choice, String answer){
        int finalScore = score;

        if(grade == 0){
            overall=+grade;
            message.setText("Your score is: "+grade+" move on to the next question");
            option1.setVisibility(View.GONE);
            option2.setVisibility(View.GONE);
            option3.setVisibility(View.GONE);
            option4.setVisibility(View.GONE);
            next.setVisibility(View.VISIBLE);
            next.setText("Next Question");
        }
        else if( choice.equals(answer)) {
            finalScore=-0;
            overall=+grade;
            message.setText("Your score is: "+grade+" move on to the next question");
            option4.setVisibility(View.GONE);
            option2.setVisibility(View.GONE);
            option3.setVisibility(View.GONE);
            next.setVisibility(View.VISIBLE);
            next.setText("Next Question");
        }
        else {
            finalScore=-1;
            grade--;
            message.setText("Your score is: "+grade);
        }

        return finalScore;
    }
    public void openActivity2() {
        Intent intent = new Intent(this, GroupAnswering.class);
        startActivity(intent);
    }
    public String questionGet(){
        DatabaseAccess newDB = new DatabaseAccess(this);
        newDB.open();
        ArrayList<String> questionsArray = newDB.getQuestions();
        newDB.close();
        String question2 = questionsArray.get(0);
        return question2;
    }
}

ошибка:

E / AndroidRuntime: FATAL EXCEPTION: Основной процесс: com.example.teambasedlearningapp, PID: 7433 java .lang.RuntimeException: Невозможно создать экземпляр действия. ComponentInfo {com.example.teambasedlearningapp / com.example.teambasedlearningapp.GroupAnswering}: java .lang.NullPointerException вызвать виртуальный метод 'android .content.pm.ApplicationInfo android .content.Context.getApplicationInfo ()' для ссылки на пустой объект в android .app.ActivityThrea d.performLaunchActivity (ActivityThread. java: 3268) в android .app.ActivityThread.handleLaunchActivity (ActivityThread. java: 3488) в android .app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem. java: 83) в android .app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor. java: 135) в android .app.servertransaction.TransactionExecutor.execute (TransactionExecutor. java: 95) в android .app .ActivityThread $ H.handleMessage (ActivityThread. java: 2049) в android .os.Handler.dispatchMessage (Обработчик. java: 106) в android .os.Looper.l oop (Looper. java: 216) при

Поэтому я спрашиваю, что является причиной этой ошибки и как ее устранить

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Возможно, вы в ближайшее время вызываете метод questionGet().

String question22= questionGet(); // right here

Таким образом, questionGet() вызывается, когда создается экземпляр действия, когда контекст еще не создан, поэтому он выдает «android .content.Context.getApplicationInfo () для пустой ссылки на объект». потому что контекст нулевой, и он требуется в:

DatabaseAccess newDB = new DatabaseAccess(this); // in questionGet() method

Попробуйте вызвать это при создании, с:

@override
onCreate(){ //in this point context isn't null

...//your ui references
...//your preview logic

question22 = questionGet();

}
0 голосов
/ 27 февраля 2020

Похоже, вы получили исключение в конструкторе.

Этот код вызывает DB в конструкторе

String question22= questionGet();

Попробуйте отладить этот метод или переместите его в onCreate. Мое мнение - плохая практика использовать любые заблокированные запросы в конструкторах или в onCreate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...