Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I'm creating a math program that asks the user how many digits they'd like to use, then asks them what kind of math they want to do. It then asks the user 10 math questions based on their answers. It then decides if they're right or wrong and displays an appropriate message. It then calculates their percentage of correct answers and displays a message based on the percentage.

I seem to have the math logic working, but as soon it loops into the second question, I get a NullpointerException.

I've never run into this issue before, but what I gathered from searching around is that it means that I'm trying to use an object that has a null value (not 100% on this?). Can anyone tell me why this code would work fine the first time around, but then throw this exception the second time around?

Thanks for any help.

Exception in thread "main" java.lang.NullPointerException at assignment2.Assignment2.askQuestion(Assignment2.java:104) at assignment2.Assignment2.main(Assignment2.java:43)

Line 104 reads

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

Line 43 reads

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

Full code

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++;
        }
    }
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
207 views
Welcome To Ask or Share your Answers For Others

1 Answer

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

All the parms to the static method askQuestion are null/zero, including "operators". There's no way for "operators" to NOT be null when you get to that squirrely assignment to "operatorText".


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share

548k questions

547k answers

4 comments

86.3k users

...