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();
}
Le numéro 2 doit être supérieur au numéro 1
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.
Utilisez Scanner.hasNextInt()
:
Renvoie
true
si le prochain jeton dans l'entrée de ce scanner peut être interprété comme une valeurint
dans le radix par défaut à l'aide de la méthodenextInt()
. 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.
String
puis try
ing 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.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);
}
}
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é.
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.
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();