-4

私のアプリでは、ユーザーは 3 種類のクイズを選択できます。彼らが「レベル」と呼ばれるクイズの種類の 1 つを選択すると、NullPointerException. 「レベル」のアルゴリズムの順序は、ゲーム タイプが「オリジナル」の場合と同じです。これは、以下のコードで確認できます。アルゴリズムが同じである理由を説明するのは難しいので、その詳細は割愛しますが、今のところアルゴリズムが同じであることを受け入れてください. :)

クイズ/ゲーム タイプが「レベル」の場合にこの NPE 例外が発生するのに、コード/アルゴリズムが同じであっても、クイズ/ゲーム タイプが「オリジナル」の場合に発生しないのはなぜですか?

public class QuestionView extends Activity  {

    int correctAnswers = 0;
    int wrongAnswers = 0;
    int answer = 0;
    int i = 0;

    long score = 0;

    long startTime = 20000;
    long interval = 1000;
    long points;

    boolean timerHasStarted = false;

    String category;

    Button answer1, answer2, answer3, answer4;
    TextView question, pointCounter, questionNumber, timeCounter, timeremaining;

    ArrayList<Question> queries;
    public static ArrayList<Long> pointsPerQuestion = new ArrayList<Long>(10);
    Timer cdTimer;

    ProgressBar bar;

    Context c;

    Singleton singleton = Singleton.getInstance();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.questionview);

        c = this;

        answer1 = (Button)findViewById(R.id.answer1);
        answer2 = (Button)findViewById(R.id.answer2);
        answer3 = (Button)findViewById(R.id.answer3);
        answer4 = (Button)findViewById(R.id.answer4);

        question = (TextView)findViewById(R.id.question);
        questionNumber = (TextView)findViewById(R.id.questionnumber);
        timeremaining = (TextView)findViewById(R.id.timeremaining);

        category = getIntent().getStringExtra("category");
        queries = getIntent().getParcelableArrayListExtra("queries");

        pointsPerQuestion.clear();

        if(singleton.getGameType() == "levels") {

            if(singleton.getLevel() <= 10) {

                cdTimer = new Timer(startTime, interval);
                bar = (ProgressBar)findViewById(R.id.progressbar);
                bar.setIndeterminate(false);
                bar.setMax(20000);

                loadLevelsQuizTen();
            }

            //...

        } else if (singleton.getGameType() == "original") {

            cdTimer = new Timer(startTime, interval);
            bar = (ProgressBar)findViewById(R.id.progressbar);
            bar.setIndeterminate(false);
            bar.setMax(20000);

            loadOriginalQuiz();

        } else if (singleton.getGameType() == "freeplay") {

            loadFreeplayQuiz();

        }
    }

    public void loadFreeplayQuiz() {

        //...

    }

    public void loadLevelsQuizTen() {

        if(i == 10) {

            cdTimer.cancel();
            endQuiz();

        } else {

            if(!timerHasStarted) {
                cdTimer.start();
                timerHasStarted = true;
            } else {
                cdTimer.start();
                timerHasStarted = false;
            }

            //answer = queries.get(i).getCorrectAnswer();  //NULLPOINTEREXCEPTION HERE
            answer = 2;    

            question.setText(queries.get(i).getQuery());  // I COMMENTED OUT ABOVE LINE OF CODE AND NOW NPE IS NOW HERE

            answer1.setText(queries.get(i).getA1());
            answer2.setText(queries.get(i).getA2());
            answer3.setText(queries.get(i).getA3());
            answer4.setText(queries.get(i).getA4());

            answer1.setOnClickListener(new OnClickListener() {
                //...
                }
            });

            answer2.setOnClickListener(new OnClickListener() {
                //...
            });

            answer3.setOnClickListener(new OnClickListener() {
                //...
            });

            answer4.setOnClickListener(new OnClickListener() {
                //...
            });
        } 
    }

    public void loadOriginalQuiz() {

        if(i == 10) {

            cdTimer.cancel();
            endQuiz();

        } else {

            if(!timerHasStarted) {
                cdTimer.start();
                timerHasStarted = true;
            } else {
                cdTimer.start();
                timerHasStarted = false;
            }

            answer = queries.get(i).getCorrectAnswer();

            question.setText(queries.get(i).getQuery());

            answer1.setText(queries.get(i).getA1());
            answer2.setText(queries.get(i).getA2());
            answer3.setText(queries.get(i).getA3());
            answer4.setText(queries.get(i).getA4());

            answer1.setOnClickListener(new OnClickListener() {
                //...
            });

            answer2.setOnClickListener(new OnClickListener() {
                //...
            });

            answer3.setOnClickListener(new OnClickListener() {
                //...
            });

            answer4.setOnClickListener(new OnClickListener() {
                //...
            });
        } 
    }

    public ArrayList<Question> getQueries() {
        return queries;
    }

    public static ArrayList<Long> getPointsPerQuestion() {
        //...
    }

    public void correct() {
        pointsPerQuestion.add(points); 
        score = score + points;
        i++;
        if(singleton.getGameType() == "original") {
            loadOriginalQuiz();
        } else if(singleton.getGameType() == "levels") {
            loadLevelsQuizTen();
        }
    }

    public void incorrect() {
        long zero = 0;
        pointsPerQuestion.add(zero);
        i++;
        loadOriginalQuiz();
    }

    public class Timer extends CountDownTimer {

        public Timer(long startTime, long interval) {
            super(startTime, interval);
        }

        @Override
        public void onFinish() {
            points = 0;
            if(i >= 9) {
                cdTimer.cancel();
                pointsPerQuestion.add(points);
                endQuiz();
            } else {
                wrongAnswers++;
                incorrect();
            }
        }

        @Override
        public void onTick(long millisUntilFinished) {
            bar.setProgress((int) millisUntilFinished);
            points = (millisUntilFinished / 200) + 1;
            timeremaining.setText("Score remaining: " + points);
            if(i < 10) {
                questionNumber.setText(c.getResources().getString(R.string.question) + " " + (i + 1) + " " + c.getResources().getString(R.string.of10));
            }
        }
    }

    public void endQuiz() {
        Intent intent = new Intent(QuestionView.this, Results.class);
        intent.putExtra("correctAnswers", correctAnswers);
        intent.putExtra("wrongAnswers", wrongAnswers);
        intent.putExtra("score", score);
        intent.putExtra("pointsPerQuestion", pointsPerQuestion);
        intent.putParcelableArrayListExtra("queries", queries);
        intent.putExtra("category", category);
        startActivity(intent);
    }

    public void onStop() {
        super.onStop();
    }

    public void onResume() {
        super.onResume();
    }
}

LogCat

06-14 20:44:45.413: E/AndroidRuntime(1335): java.lang.RuntimeException: Unable to start activity ComponentInfo{matt.lyons.bibletrivia.lite/matt.lyons.bibletrivia.lite.QuestionView}: java.lang.NullPointerException
06-14 20:44:45.413: E/AndroidRuntime(1335):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
06-14 20:44:45.413: E/AndroidRuntime(1335):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
06-14 20:44:45.413: E/AndroidRuntime(1335):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
06-14 20:44:45.413: E/AndroidRuntime(1335):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
06-14 20:44:45.413: E/AndroidRuntime(1335):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-14 20:44:45.413: E/AndroidRuntime(1335):     at android.os.Looper.loop(Looper.java:137)
06-14 20:44:45.413: E/AndroidRuntime(1335):     at android.app.ActivityThread.main(ActivityThread.java:5041)
06-14 20:44:45.413: E/AndroidRuntime(1335):     at java.lang.reflect.Method.invokeNative(Native Method)
06-14 20:44:45.413: E/AndroidRuntime(1335):     at java.lang.reflect.Method.invoke(Method.java:511)
06-14 20:44:45.413: E/AndroidRuntime(1335):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
06-14 20:44:45.413: E/AndroidRuntime(1335):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-14 20:44:45.413: E/AndroidRuntime(1335):     at dalvik.system.NativeStart.main(Native Method)
06-14 20:44:45.413: E/AndroidRuntime(1335): Caused by: java.lang.NullPointerException
06-14 20:44:45.413: E/AndroidRuntime(1335):     at matt.lyons.bibletrivia.lite.QuestionView.loadLevelsQuizTen(QuestionView.java:195)
06-14 20:44:45.413: E/AndroidRuntime(1335):     at matt.lyons.bibletrivia.lite.QuestionView.onCreate(QuestionView.java:80)
06-14 20:44:45.413: E/AndroidRuntime(1335):     at android.app.Activity.performCreate(Activity.java:5104)
06-14 20:44:45.413: E/AndroidRuntime(1335):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
06-14 20:44:45.413: E/AndroidRuntime(1335):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
4

3 に答える 3

3

なぜ「受け入れる」のか?それがあなたの議論の致命的な欠陥かもしれません。

問題は次のとおりです。

Caused by: java.lang.NullPointerException
06-14 20:44:45.413: E/AndroidRuntime(1335):     at matt.lyons.bibletrivia.lite.QuestionView.loadLevelsQuizTen(QuestionView.java:195)

QuestionView.java ファイルの 195 行目に移動し、その行のオブジェクト参照を調べて、初期化に失敗したものを確認します。

すべてがうまくいっていると自分に言い聞かせるのをやめて、実際に何が起こっているのかを見始めるのが早ければ早いほど、問題を解決して先に進むことができます。

コードを複製しないでください。単一のメソッド呼び出しでカプセル化し、両方の場所で呼び出す必要があります。これはエラーのレシピです。

あなたは他にもたくさんの問題を抱えています。プライベート データ メンバー i を使用して、さまざまなメソッドでさまざまなことを行います。私が見ることができる方法では同期されていません。その値をメソッド パラメーターにして渡せなかった理由がわかりません。その方がスレッド セーフが高くなります。

そのようなことをしているとき、文字列を == と比較したり、コードを複製したりすると、あなたが行ったことすべてが私にとって疑わしいものになります。あなたが困っているのも不思議ではありません。クローズする投票。

于 2013-06-14T20:50:25.587 に答える
0

2 つの異なるメソッドを呼び出しているため、エラーが発生します。あなたが呼び出すレベルloadLevelsQuizTen();では、オリジナルではあなたが呼び出しますloadOriginalQuiz();

あなたが同じだと言っているにもかかわらず、そうではありません。デバッガーを使用してメソッドをステップ実行し、null とその理由を突き止めます。

于 2013-06-14T20:51:41.470 に答える