Как запросить ввод данных пользователем, пока ввод не будет действительным? - PullRequest
0 голосов
/ 13 июня 2018

Я хочу, чтобы пользователь ввел два двойных числа, представляющих стороны треугольника, а затем вычислил гипотенузу.Сначала пользователь указывает, какую команду (A, B, C или Q) он хочет, затем для A и B (боковой ввод) его просят ввести двойное число.Прямо сейчас, когда они не вводят двойное число, программа запрашивает их для первого ввода (A, B, C, Q).Я хочу, чтобы программа просто запрашивала у них еще один дубль, пока ввод не будет действительным.

Мой код выглядит следующим образом:

import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {

public static void main(String[] args) {

    Double sideA = null;
    Double sideB = null;
    Scanner scanner = new Scanner(System.in);


    while (true) {

        System.out.println("Enter command: ");
        String command = scanner.nextLine();

        try {   // checks command, throws exception if not A, B, C or Q
            if (command.equals("A")) {
                System.out.println("Enter a value for side A:");
                sideA = scanner.nextDouble();                       // throws InputMismatchException if not a double
                scanner.nextLine();
                try {
                    if (sideA < 0 || sideA == 0.0) {
                        throw new InputMismatchException();
                    }
                } catch (InputMismatchException e) {
                    System.out.println("Value is invalid. Must be positve and a double.");
                }

            }
            else if (command.equals("B")) {
                System.out.println("Enter a value for side B:");
                sideB = scanner.nextDouble();                       // throws InputMismatchException if not a double
                scanner.nextLine();

                try {
                    if (sideB < 0 || sideB == 0.0) {
                        throw new InputMismatchException();
                    }
                } catch (InputMismatchException e) {
                    System.out.println("Value is invalid. Must be positive and a double.");
                }

            }
            else if (command.equals("C")) {
                Triangle calculate = new Triangle(sideA, sideB);
                System.out.println(calculate.calcHypotenuse());
                break;
            }
            else if (command.equals("Q")) {
                System.exit(0);
            }
            else {
                throw new IllegalArgumentException();
            }

        } 
        catch (IllegalArgumentException e) {
            System.out.println("Command is invalid, Enter A, B, C, or Q.");
        }
        catch (InputMismatchException e) {
            System.out.println("Value is invalid. Must be positve and a double.");
            scanner.nextLine();
        }

    }
}   

}

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Используйте вложенный цикл while для получения желаемого двойного значения:

private Scanner scanner = new Scanner(System.in);

private double getDoubleInput() {
    double ret = -1;
    while (ret < 0) {
        try {
            ret = scanner.nextDouble(); 
        }catch (InputMismatchException e) {
            System.out.print("Enter a valid double value: ");
        }
    }
    return ret;
}

Это обрабатывает как NaN, так и отрицательные числа, запрашивая у пользователя действительное двойное значение, пока не будет введено положительное двойное число.Убедитесь, что Scanner является переменной класса, чтобы этот метод мог получить к ней доступ.

0 голосов
/ 13 июня 2018

Хорошо, во-первых, пожалуйста, сделайте правильный отступ с достаточным количеством комментариев, чтобы объяснить ваш мыслительный процесс.

Во-вторых, есть еще несколько неясных вещей.

try {   // checks command, throws exception if not A, B, C or Q
            if (command.equals("A")) {
                System.out.println("Enter a value for side A:");
                sideA = scanner.nextDouble();                       // throws InputMismatchException if not a double
                scanner.nextLine();

в приведенном выше коде в последней строке у вас есть входные данные, взятые из объекта класса Scanner, которые ни во что не сохраняются.

Зачем вам это нужно?Какова его цель?

В-третьих, в вашем коде много дубликатов кода с количеством IF-ELSE-IF.Попробуйте этот же код с SWITCH , именно этой проблемы вы можете избежать, если будете использовать SWITCH вместо IF-ELSE .

И причина того, что вы по-прежнему получаете Prompt на enter a command, заключается в том, что вы поместили его в цикл while.Извлечение его из этого места и замена его извне сделают свое дело.

Что подводит меня к моему последнему пункту, как только вы получите то, что вам нужно т.е. правильный ответ или исключение для неверного ввода , тогда зачем вам продолжать проверять один и тот же оператор снова и снова?

while(true){
      ......
      ......
      ......
}

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

Чтобы устранить эту проблему, либо удалите while loop, либо принимайте другой ввод от пользователя, пока он не введет желаемое значение, а затем break как только будет достигнут желаемый .

0 голосов
/ 13 июня 2018

Быстро просмотрев свой код, вы можете получить то, что хотите, просто переместив командную строку за пределы цикла while

String command = null;
while (true) {

    if (command == null) {
        System.out.println("Enter command: ");
        command = scanner.nextLine();
    }
    ....

}

Также рассмотрите возможность объединения кода try-catch, чтобы не дублироватькод

...