Java, как проверить ввод при использовании сканера? - PullRequest
0 голосов
/ 10 марта 2020

Я сейчас работаю над кодом Java, в основном работает ввод int. Однако, если я наберу символ, вся система падает. Мой вопрос заключается в том, что нужно изменить в приведенном ниже коде, чтобы пользователь получил сообщение о том, что только int является допустимым вводом, и попытался еще раз, если они вводят символ.

do {
    System.out.println("How many players would like to participate in this game?\t(2-4 players)");
    numberOfPlayers = in.nextInt();
} while(in.hasNextInt()); 

numberOfPlayers = in.nextInt();

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Я лично предпочитаю использовать while l oop для такого рода вещей, чем do / while . Не то, чтобы с do / while было что-то не так, я просто чувствую, что лучше использовать , а l oop.

Я согласен с другими здесь, принимаю строковые цифры от пользователя вместо целого числа. По моему мнению, это избавит вас от возможных проблем в будущем, и вам не нужно целенаправленно применять механизм try / catch , если пользователь предоставит неверную запись. Это также позволяет вам легко применить механизм для выхода приложения, которое, опять же ИМХО, должно быть доступно для всех консольных приложений.

У вас есть ответ для выполнения задачи используя do / while l oop, но я хотел бы показать вам другой способ сделать это:

Scanner in = new Scanner(System.in);
String ls = System.lineSeparator();
int numberOfPlayers = 0;
String userInput = "";

while (userInput.equals("")) {
    // The Prompt to User...
    System.out.print("How many players would like to participate in this game?" + ls 
            + "2 to 4 players only (q to quit): --> ");
    userInput = in.nextLine();

    // Did the User enter: q, quit (regardless of letter case) 
    if (userInput.toLowerCase().charAt(0) == 'q') {
        // No, the User didn't...
        System.out.println(ls + "Quiting Game - Bye Bye.");
        System.exit(0);  // Close (exit) the application.
    }

    /* Did the User supply a string representation of a numerical 
       digit consiting of either 2, 3, or 4.      */
    if (!userInput.matches("[234]")) { 
        // No, the User didn't...
        System.out.println("Invalid input! You must supply a number from 2 to 4 "
                         + "(inclusive)." + ls + "Try again..." + ls);
        userInput = "";
        continue;  // Loop again.
    }

    // Convert numerical string digit to an Ingeger value.
    numberOfPlayers = Integer.parseInt(userInput);
} 

System.out.println(ls + "The Number of players you provided is: --> " 
                 + numberOfPlayers);

Вы заметите, что Scanner # Метод nextLine () используется для приема ввода пользователя в виде строки. Теперь это означает, что нам нужно проверить тот факт, что этот пользователь предоставил строковое представление целочисленного числа di git (от 2 до 4 включительно). Для этого вы заметите, что я использовал метод String # match () вместе с небольшим Regular Expression (RegEx), который состоит из следующей строки: "[234]". Что это делает в сочетании с методом String # match () , так это то, что он проверяет, содержит ли строковое значение в переменной userInput одну "2", одну "3" ", или один" 4 ". Все остальное, кроме одной из этих трех цифр, будет отображать это сообщение:

Invalid input! You must supply a number from 2 to 4 (inclusive).
Try again...

и заставить пользователя сделать еще одну запись.

0 голосов
/ 10 марта 2020

Сделайте это следующим образом:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        boolean valid;
        int numberOfPlayers;
        do {
            valid = true;
            System.out.println("How many players would like to participate in this game?\t(2-4 players)");
            try {
                numberOfPlayers = Integer.parseInt(in.nextLine());
            } catch (NumberFormatException e) {
                System.out.println("Wrong input. Try again.");
                valid = false;
            }
        } while (!valid);
    }
}

Пробный прогон:

How many players would like to participate in this game?    (2-4 players)
a
Wrong input. Try again.
How many players would like to participate in this game?    (2-4 players)
b
Wrong input. Try again.
How many players would like to participate in this game?    (2-4 players)
3
...