Java проверка ввода try-catch с циклом do-while - PullRequest
0 голосов
/ 17 февраля 2020

Я сидел здесь (смущающе) в течение нескольких часов, пытаясь убедить меня, что я oop могу принять ввод пользователя, пока он не будет действителен, но мне кажется, что я ошибаюсь, когда дело доходит до логического значения, которое я ' м, чтобы попытаться выйти из l oop. Всякий раз, когда я могу заставить программу частично работать, исключение catch просто заканчивается бесконечным повторением.

Scanner scnr = new Scanner(System.in);

double wallHeight = 0.0;
boolean valid = false;

// Implement a do-while loop to ensure input is valid
// Prompt user to input wall's height
do {
    try {
        System.out.println("Enter wall height (feet): ");
        wallHeight = scnr.nextDouble();
        valid = false;

        if (wallHeight <=0) {
            throw new Exception ("Invalid Input");
        }
    }
    catch (Exception e) {
        System.out.println("Invalid Input");
    }
} while (!valid);

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Начните с предположения, что вводом является valid (и установите valid в true на каждой итерации l oop). Устанавливайте valid на false только тогда, когда вы столкнетесь с исключением (возможно, с тем, которое вы подняли).

do {
    valid = true;
    try {
        System.out.println("Enter wall height (feet): ");
        wallHeight = scnr.nextDouble();
        if (wallHeight <= 0) {
            throw new Exception("Invalid Input");
        }
    } catch (Exception e) {
        valid = false;
        System.out.println("Invalid Input");
    }
} while (!valid);

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

do {
    valid = true;
    System.out.println("Enter wall height (feet): ");
    wallHeight = scnr.nextDouble();
    if (wallHeight <= 0) {
        System.out.println("Invalid Input");
        valid = false;
    }
} while (!valid);

также будет работать. Конечно, это предполагает, что пользователь вводит только действительные значения double (s). Если вам нужно обработать произвольный ввод, вы должны проверить, есть ли double, прежде чем пытаться использовать его (и вы должны использовать все, что не является double, или у вас есть бесконечное число l oop). Мол,

do {
    valid = true;
    System.out.println("Enter wall height (feet): ");
    if (scnr.hasNextDouble()) {
        wallHeight = scnr.nextDouble();
        if (wallHeight <= 0) {
            System.out.println("Invalid Input");
            valid = false;
        }
    } else {
        System.out.println("Invalid Input " + scnr.nextLine());
        valid = false;
    }
} while (!valid);
0 голосов
/ 17 февраля 2020

Вот еще один вариант. Я только что переместил код, который устанавливает valid = true после проверки if. Это может сделать это далеко только тогда, когда это действительно. В противном случае значение valid будет false, и оно будет l oop.

public class BasicDoWhile {

    public static void main(String[] args) {
        double wallHeight = 0.0;
        boolean valid = false;

        Scanner scnr = new Scanner(System.in);

        // Implement a do-while loop to ensure input is valid
        // Prompt user to input wall's height
        do {
            try {
                System.out.println("Enter wall height (feet): ");
                wallHeight = scnr.nextDouble();

                if (wallHeight <= 0) {
                    throw new Exception("Invalid Input");
                }

                valid = true;

            }
            catch (Exception e) {
                System.out.println("Invalid Input");
            }

        } while (!valid);

    }
}
...