Как я могу избежать этого бесконечного дела l oop? - PullRequest
0 голосов
/ 28 января 2020

Мне нужно, чтобы пользователь ввел целое число x, например 0 <= x <= 4, и чтобы пользователь повторил попытку, пока он наконец не вставит действительное целое число. </p>

Это мой код:

do {
    System.out.println("Input an integer number between 0 and 4 (inclusive): ");
    if (in.hasNextInt()) {
        n = in.nextInt();
    }

    if (n >= 0 && n <= 4) {
        valid = true;
    }
} while (!valid);

Я попытался вставить "s", но как только я нажал, введите циклические циклы и продолжил печатать строку, напечатанную этим System.out.println. Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Подход, который вы хотите, - это прочитать любой вход (используя next() на сканере), затем попытаться преобразовать его в int и, наконец, отойти от l oop, если значение находится в указанном диапазоне.

Использование hasNextInt вернет истину / ложь, что, как представляется, то, что вы хотите, но также важно, что "не продвигается дальше любого input. " Таким образом, если вы введете" s ", hasNextInt() вернет false, ввод" s "останется неиспользованным, и каждый раз через l oop он будет снова вызывать hasNextInt() (что снова верните false), et c.

Вот правка в вашем коде, показывающая, как сделать это правильно:

Scanner in = new Scanner(System.in);
do {
    System.out.print("Input an integer number between 0 and 4 (inclusive): ");

    try {
        String next = in.next();
        int n = Integer.parseInt(next);
        if (n >= 0 && n <= 4) {
            System.out.println("valid input: " + n);
            break;
        }
    } catch (NumberFormatException e) {
        // print a warning message if you want, "only integer values allowed"
    }

} while (true);

Еще один способ заставить эту работу продолжить использование hasNextInt(), но также: если результат ложный, добавьте код, который будет использовать любой токен, отличный от int.

0 голосов
/ 28 января 2020

Не используйте has методы, если вы не знаете, что делаете; метод nextInt будет блокироваться, пока пользователь не введет что-либо. Если они ввели не целое число, то вы получите исключение; это обычно то, что вы хотите. Если вы хотите изящно обрабатывать (например, печатать для пользователя, которого они неправильно набрали), нецелые входные данные, вы можете перехватить это исключение и рассматривать его как ошибочный поток, который затем улучшаете, или вы обновляете идею, лежащую в основе. этот код, утверждающий, что, если вы точно так же можете обрабатывать нецелочисленный ввод, вы вообще не запрашиваете целое число; в этом случае вместо этого вызовите .next() и проанализируйте его в целое число, если оно одно, через Integer.parseInt или, если нет, укажите, что пользователь ввел недопустимое значение, и продолжайте. Ни в коем случае вам не нужен метод has, на самом деле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...