-2

ユーザーに何桁の数字を使用したいかを尋ね、次にどのような計算をしたいかを尋ねる数学プログラムを作成しています。次に、ユーザーの回答に基づいて 10 の数学の質問をします。次に、それらが正しいか間違っているかを判断し、適切なメッセージを表示します。次に、正解の割合を計算し、割合に基づいてメッセージを表示します。

数学ロジックが機能しているように見えますが、2 番目の質問にループするとすぐに、NullpointerException が発生します。

これまでこの問題に遭遇したことはありませんが、検索して集めたのは、null 値を持つオブジェクトを使用しようとしているということです (これで 100% ではありませんか?)。このコードが最初は正常に動作するのに、2 回目にはこの例外をスローする理由を誰か教えてもらえますか?

助けてくれてありがとう。

スレッド「メイン」での例外 java.lang.NullPointerException at assignment2.Assignment2.askQuestion(Assignment2.java:104) at assignment2.Assignment2.main(Assignment2.java:43)

行 104 読み取り

operatorText = (selectedOperator == 5) ? operators[(int) Math.floor(Math.random() * operators.length)] : operators[selectedOperator - 1];

行 43 読み取り

   askQuestion(0, null, 0, 0, null, 0);

完全なコード

import java.util.*;
import javax.swing.JOptionPane;

public class Problem2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        int difficulty = 1;
        String[] operators = {"plus", "minus", "times", "divided by"};
        int selectedOperator = 1;
        int correctAnswers = 0;
        int answeredTyped = 0;

        int difficultyInput = Integer.parseInt(
            JOptionPane.showInputDialog("Please choose the difficulty. " +
                    "Enter the number of digits to use in each problem."));

        if (difficultyInput > 0) {
            difficulty = difficultyInput;
        }
        int arithmeticMethod = Integer.parseInt(
            JOptionPane.showInputDialog(
                "Choose an arithmetic problem to study: 1 " +
                "= Addition Only, 2 = Subtraction Only, 3 = " +
                "Multiplication Only, 4 = Division Only, 5 = Random Problems" ));

        selectedOperator = arithmeticMethod;

        new Problem2().askQuestion(difficulty, null,
                    arithmeticMethod, arithmeticMethod,
                                operators, arithmeticMethod);

        while(answeredTyped < 10) {
            askQuestion(0, null, 0, 0, null, 0);
            if(((float)correctAnswers / answeredTyped) >= 0.75) {
                JOptionPane.showMessageDialog(null,
                    "Congratulations, you are ready to go on to the next level!");
            } else {
                JOptionPane.showMessageDialog(
                    null, "Please ask your teacher for extra help.");
            }
        }
    }

    public static boolean checkResponse (double primaryInt,
            double secondaryInt, String operatorText, double response){
        if (operatorText.equals("plus")) {
            return (primaryInt + secondaryInt) == response;
        } else if (operatorText.equals("minus")) {
            return (primaryInt - secondaryInt) == response;
        } else if (operatorText.equals("times")) {
            return (primaryInt * secondaryInt) == response;
        } else if (operatorText.equals("divided by")) {
            return (primaryInt / secondaryInt) == response;
        }
        return false;
    }

    public static String displayResponse (boolean isCorrect) {
        int randomIndex = (int) (Math.floor(Math.random() * (4 - 1 + 1)) + 1);
        switch (randomIndex) {
            case 1:
                return isCorrect ? "Very Good!" : "No. Please try again.";
            case 2:
                return isCorrect ? "Excellent!" : "Wrong. Try once more.";
            case 3:
                return isCorrect ? "Nice Work!" : "Don\'t give up!";
            case 4:
                return isCorrect ? "Keep up the good work!" : "No. Keep trying.";
        }
        return "Oops...";
    }

    public static void askQuestion(int difficulty,
            String operatorText, int selectedOperator,
                int answeredTyped, String[] operators, int correctAnswers){
        boolean correctAnswer = false;
        double primaryInt = Math.floor(Math.pow(10,
            difficulty-1) + Math.random() * 9 * Math.pow(10, difficulty-1));
        double secondaryInt = Math.floor(Math.pow(10,
            difficulty-1) + Math.random() * 9 * Math.pow(10, difficulty-1));
        operatorText = (selectedOperator == 5) ? operators[(int) Math.floor(Math.random() * operators.length)] : operators[selectedOperator - 1];

        while(!correctAnswer && answeredTyped < 10) {
            double response = Double.parseDouble (
                JOptionPane.showInputDialog("How much is " +
                    primaryInt + " " + operatorText + " " + secondaryInt + "?"));
            correctAnswer = checkResponse (primaryInt,
                    secondaryInt, operatorText, response);
            JOptionPane.showMessageDialog(null, displayResponse(correctAnswer));

            answeredTyped++;

            if(correctAnswer)
                correctAnswers++;
        }
    }
}
4

1 に答える 1

3

askQuestion(0, null, 0, 0, null, 0);

静的メソッド askQuestion のすべてのパラメータは、「演算子」を含めて null/ゼロです。「operatorText」への奇妙な割り当てに到達したときに、「operators」が null ではない方法はありません。

于 2013-09-29T02:49:54.857 に答える