web-dev-qa-db-fra.com

Comment utiliser Scanner pour accepter uniquement un entier valide en entrée

J'essaie de rendre un petit programme plus robuste et j'ai besoin d'aide pour cela.

Scanner kb = new Scanner(System.in);
int num1;
int num2 = 0;

System.out.print("Enter number 1: ");
num1 = kb.nextInt();

while(num2 < num1) {
    System.out.print("Enter number 2: ");
    num2 = kb.nextInt();
}
  1. Le numéro 2 doit être supérieur au numéro 1

  2. Je veux également que le programme vérifie et ignore automatiquement si l'utilisateur entre un caractère au lieu d'un nombre. Parce que maintenant, quand un utilisateur entre par exemple r au lieu d'un nombre, le programme vient de sortir.

23
John

Utilisez Scanner.hasNextInt() :

Renvoie true si le prochain jeton dans l'entrée de ce scanner peut être interprété comme une valeur int dans le radix par défaut à l'aide de la méthode nextInt(). Le scanner n'avance au-delà d'aucune entrée.

Voici un extrait pour illustrer:

Scanner sc = new Scanner(System.in);
System.out.print("Enter number 1: ");
while (!sc.hasNextInt()) sc.next();
int num1 = sc.nextInt();
int num2;
System.out.print("Enter number 2: ");
do {
    while (!sc.hasNextInt()) sc.next();
    num2 = sc.nextInt();
} while (num2 < num1);
System.out.println(num1 + " " + num2);

Vous n'avez pas à parseInt ni à vous soucier de NumberFormatException. Notez que puisque les méthodes hasNextXXX ne progressent au-delà d'aucune entrée, vous devrez peut-être appeler next() si vous voulez ignorer les "ordures", comme indiqué ci-dessus.

Questions connexes

31
  1. la condition num2 <num1 doit être num2 <= num1 si num2 doit être supérieur à num1
  2. ne sachant pas ce qu'est l'objet kb, je lirais un String puis trying Integer.parseInt() et si vous n'avez pas catch une exception alors c'est un nombre, si vous le faites, lisez-en un nouveau, peut-être en définissant num2 sur Integer.MIN_VALUE et en utilisant le même type de logique dans votre exemple.
4
Ledhund

Cela devrait fonctionner:

import Java.util.Scanner;

public class Test {
    public static void main(String... args) throws Throwable {
        Scanner kb = new Scanner(System.in);

        int num1;
        System.out.print("Enter number 1: ");
        while (true)
            try {
                num1 = Integer.parseInt(kb.nextLine());
                break;
            } catch (NumberFormatException nfe) {
                System.out.print("Try again: ");
            }

        int num2;
        do {
            System.out.print("Enter number 2: ");
            while (true)
                try {
                    num2 = Integer.parseInt(kb.nextLine());
                    break;
                } catch (NumberFormatException nfe) {
                    System.out.print("Try again: ");
                }
        } while (num2 < num1);

    }
}
3
aioobe

Essaye ça:

    public static void main(String[] args)
    {
        Pattern p = Pattern.compile("^\\d+$");
        Scanner kb = new Scanner(System.in);
        int num1;
        int num2 = 0;
        String temp;
        Matcher numberMatcher;
        System.out.print("Enter number 1: ");
        try
        {
            num1 = kb.nextInt();
        }

        catch (Java.util.InputMismatchException e)
        {
            System.out.println("Invalid Input");
            //
            return;
        }
        while(num2<num1)
        {
            System.out.print("Enter number 2: ");
            temp = kb.next();
            numberMatcher = p.matcher(temp);
            if (numberMatcher.matches())
            {
                num2 = Integer.parseInt(temp);
            }

            else
            {
                System.out.println("Invalid Number");
            }
        }
    }

Vous pouvez également essayer d'analyser la chaîne dans un int, mais généralement les gens essaient d'éviter de lever des exceptions.

Ce que j'ai fait, c'est que j'ai défini une expression régulière qui définit un nombre, \d signifie un chiffre numérique. Le + signe signifie qu'il doit y avoir un ou plusieurs chiffres numériques. L'extra \ en face de la \d est parce qu'en Java, le \ est un caractère spécial, il doit donc être échappé.

2
npinti

Ce que vous pouvez faire est également de prendre le prochain jeton comme une chaîne, convertit cette chaîne en un tableau de caractères et de tester cela chaque caractère du tableau est un chiffre .

Je pense que c'est exact, si vous ne voulez pas traiter des exceptions.

0
LB40

Je vois que Character.isDigit convient parfaitement au besoin, car l'entrée ne sera qu'un seul symbole. Bien sûr, nous n'avons aucune information sur cet objet kb, mais juste au cas où il s'agirait d'une instance Java.util.Scanner, je suggère également d'utiliser Java.io.InputStreamReader pour l'entrée en ligne de commande. Voici un exemple:

Java.io.BufferedReader reader = new Java.io.BufferedReader(new Java.io.InputStreamReader(System.in));
try {
  reader.read();
}
catch(Exception e) {
  e.printStackTrace();
}
reader.close();
0
Elijah Saounkine