Чтение ввода из поля JOptionPane.showInputDialog

Я почти закончил с этим проектом. Это мой самый первый, и мне нужно немного лучше прочитать входные данные из окна JOption. Например, я хочу вернуться на предыдущую страницу, если пользователь нажимает "отменить" или закрыть программу. До сих пор каждый раз, когда я нажимаю "отменить", моя программа вылетает. Помоги мне! Я только начал изучать Java около месяца назад. Я думаю, у меня все хорошо. Большое спасибо!

Вот код,

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

/**
 * Write a description of class Operation here.
 *
 * @author Charles Kossivi
 * @version 1.0
 */
public class Operation {

    static String firstNumber; //first number or coefficient
    static String secondNumber; //second number or coefficient
    static String thirdNumber; //third number or coefficient
    static String operationType = ""; //Operation type
    static boolean anotherOperation = false;
    static boolean goodType = true; //true=run program false=stop program
    static boolean numberTypeA = true; // another operation?
    static boolean numberTypeB = true; // another operation? 
    static boolean numberTypeC = true; // another operation? 
    static Scanner keyInput = new Scanner(System.in);
    static String inputType; // temperature type
    static double a; // first number
    static double b; // second number
    static double c; // third number
    static double s; // sum of a and b
    static double d; // difference of a and b
    static double p; // product of a and b
    static double r; // ratio of a and b
    static double D; // discriminant
    static double numType;

    public static void main(String[] args) {
        while (goodType) {
            operationType = JOptionPane.showInputDialog("Welcome! \nPlease, Select the Desired Operation Type"
                    + "(\nA=Addition, \nD=Division, \nE=Quadratic Equation, "
                    + "\nM=Multiplication, \nS=Subtraction, \nQ=Quit");
            if (operationType.equalsIgnoreCase("A")) {
                newAddition();
            }
            if (operationType.equalsIgnoreCase("S")) {
                newSubtraction();
            }
            if (operationType.equalsIgnoreCase("M")) {
                newMultiplication();
            }
            if (operationType.equalsIgnoreCase("D")) {
                newDivision();
            }
            if (operationType.equalsIgnoreCase("E")) {
                newQuadratic();
            }
            if (operationType.equalsIgnoreCase("Q")) {
                // quit   
                JOptionPane.showMessageDialog(null, "\nProgram ended. \nThank You!");
                goodType = false;
            }
        }
        goodType = false;
    }

    //Start Addition class here
    private static void newAddition() {
        //read in first coefficient from user as a string
        firstNumber = JOptionPane.showInputDialog("Please, Enter First Number");
        if (firstNumber.equalsIgnoreCase("Q")) {
            // quit   
            JOptionPane.showMessageDialog(null, "\nProgram ended. \nThank You!");
            goodType = false;
        } else {
            a = Double.parseDouble(firstNumber);
            //read in second coefficient from user as a string
            secondNumber = JOptionPane.showInputDialog("Please, Enter Second Number");
            if (secondNumber.equalsIgnoreCase("Q")) {
                // quit   
                JOptionPane.showMessageDialog(null, "\nProgram ended. \nThank You!");
                goodType = false;
            } else {
                b = Double.parseDouble(secondNumber);
                //Adding the numbers
                s = a + b;
                //Display results
                JOptionPane.showMessageDialog(null, "The sum is " + s);
            }
        }
    }

    //End Addition class
    //Start Addition class here
    private static void newSubtraction() {
        //read in first coefficient from user as a string
        firstNumber = JOptionPane.showInputDialog("Please, Enter First Number");
        if (firstNumber.equalsIgnoreCase("Q")) {
            // quit   
            JOptionPane.showMessageDialog(null, "\nProgram ended. \nThank You!");
            goodType = false;
        } else {
            a = Double.parseDouble(firstNumber);
            //read in second coefficient from user as a string
            secondNumber = JOptionPane.showInputDialog("Please, Enter Second Number");
            if (secondNumber.equalsIgnoreCase("Q")) {
                // quit   
                JOptionPane.showMessageDialog(null, "\nProgram ended. \nThank You!");
                goodType = false;
            } else {
                b = Double.parseDouble(secondNumber);
                //Subtraction the numbers
                d = a - b;
                //Display results
                JOptionPane.showMessageDialog(null, "The sum is " + d);
            }
        }
    }//End Subtraction class

    // Begin Multiplication class
    private static void newMultiplication() {
        //read in first coefficient from user as a string
        firstNumber = JOptionPane.showInputDialog("Please, Enter First Number");
        if (firstNumber.equalsIgnoreCase("Q")) {
            // quit   
            JOptionPane.showMessageDialog(null, "\nProgram ended. \nThank You!");
            goodType = false;
        } else {
            a = Double.parseDouble(firstNumber);
            //read in second coefficient from user as a string
            secondNumber = JOptionPane.showInputDialog("Please, Enter Second Number");
            if (secondNumber.equalsIgnoreCase("Q")) {
                // quit   
                JOptionPane.showMessageDialog(null, "\nProgram ended. \nThank You!");
                goodType = false;
            } else {
                b = Double.parseDouble(secondNumber);
                //multiplying the numbers
                p = a * b;
                //Display results
                JOptionPane.showMessageDialog(null, "The product is " + p);
            }
        }
    } // End Multiplication class

    //Start Division class
    private static void newDivision() {
        //read in first coefficient from user as a string
        firstNumber = JOptionPane.showInputDialog("Please, Enter First Number");
        if (firstNumber.equalsIgnoreCase("Q")) {
            // quit   
            JOptionPane.showMessageDialog(null, "\nProgram ended. \nThank You!");
            goodType = false;
        } else {
            a = Double.parseDouble(firstNumber);
            //read in second coefficient from user as a string
            secondNumber = JOptionPane.showInputDialog("Please, Enter Second Number");
            if (secondNumber.equalsIgnoreCase("Q")) {
                // quit   
                JOptionPane.showMessageDialog(null, "\nProgram ended. \nThank You!");
                goodType = false;
            } else {
                b = Double.parseDouble(secondNumber);
                //Dividing the numbers
                r = a / b;
                //Display results
                JOptionPane.showMessageDialog(null, "The ratio is " + r);
            }
        }
    } //End Division class

    //Start Quadratic class
    private static void newQuadratic() {
        //read in first coefficient from user as a string
        firstNumber = JOptionPane.showInputDialog("Please, Enter First Number");
        if (firstNumber.equalsIgnoreCase("Q")) {
            // quit   
            JOptionPane.showMessageDialog(null, "\nProgram ended. \nThank You!");
            goodType = false;
        } else {
            a = Double.parseDouble(firstNumber);
            //read in second coefficient from user as a string
            secondNumber = JOptionPane.showInputDialog("Please, Enter Second Number");
            if (secondNumber.equalsIgnoreCase("Q")) {
                // quit   
                JOptionPane.showMessageDialog(null, "\nProgram ended. \nThank You!");
                goodType = false;
            } else {
                b = Double.parseDouble(secondNumber);
                //read in third coefficient from user as a string
                thirdNumber = JOptionPane.showInputDialog("Please, Enter Third coefficient");
                if (thirdNumber.equalsIgnoreCase("Q")) {
                    // quit   
                    JOptionPane.showMessageDialog(null, "\nProgram ended. \nThank You!");
                    goodType = false;
                } else {
                    c = Double.parseDouble(thirdNumber);
                    //Quadratic formula
                    D = (Math.sqrt(b * b - 4 * a * c)) / (2 * a);
                    //Display results
                    if (D >= 0) {
                        JOptionPane.showMessageDialog(
                                null, "The equation's first real root is " + ((-b + D) / (2 * a)) + "\n"
                                + "The equation's second real root is " + ((-b - D) / (2 * a)) + "\n");
                    } else {
                        JOptionPane.showMessageDialog(
                                null, "The equation has no real solution");
                    }
                }
            }
        }
    }// end class quadratics
}

1 ответ

Ваша проблема в том, что, если пользователь нажимает кнопку отмены, operationType имеет значение null и, следовательно, создает исключение NullPointerException. Я бы предложил вам переехать

if (operationType.equalsIgnoreCase("Q"))

в начало группы операторов if, а затем измените его на

if(operationType==null||operationType.equalsIgnoreCase("Q")).

Это заставит программу завершить работу так же, как если бы пользователь нажал кнопку отмены, выбрав опцию выхода.

Затем измените все остальные ifs на else if. Таким образом, как только программа увидит, является ли ввод нулевым, она не пытается вызывать что-либо еще для operationType. Это дает дополнительное преимущество, заключающееся в том, что он становится более эффективным: как только программа увидит, что ввод является одним из вариантов, она не станет проверять его на соответствие остальным.

Другие вопросы по тегам