J'essaie de faire le programme de sorte que l'utilisateur puisse donner l'entrée de l'entier du mois (par exemple, lorsque l'utilisateur entre le numéro 4, la sortie devrait être avril) et il continuera à demander si longtemps que l'utilisateur entre un nombre valide (1 - 12 ). Si l'utilisateur entre un nombre invalide, le programme doit dire "Invalid!", Puis se terminer. Cependant, mon programme ne peut pas suivre la boucle while et définir immédiatement le nombre invalide comme exception. Que dois-je faire pour que le programme dise "Invalid!"? Merci!
String[] months = new String[] {"January", "February", "March", "April", "May", "June", "July", "August", "September", "Oktober", "November", "December"}; Scanner input = new Scanner(System.in); int i = 1; while(i < 13 && i > 0) { if(i > 12 && i < 1) { break; } else { System.out.println("Month?"); i = input.nextInt(); System.out.println(months[i - 1] + "\n"); } } System.out.println("Invalid!");
6 Réponses :
Vous devriez vérifier que la limite du tableau est comprise entre 0 et mois.longueur-1, car l'index du tableau commence à 0. Si vous évitez d'attraper indexOutOfbounds, cela indique plutôt un problème avec le code.
i = input.nextInt(); if(i-1 < 0 || i-1 >= months.length) { break; } else { System.out.println(months[i - 1] + "\n"); }
Votre condition if est toujours fausse, car un nombre ne peut pas être> 12 et i <1 en même temps. Utilisez i > 12 || i < 1
place.
L'exception se produit lors de l'accès au tableau, vous pouvez donc d'abord lire le numéro suivant, puis le vérifier et accéder au tableau uniquement si le numéro est valide.
La liste corrigée (au minimum) serait:
String[] months = new String[] {"January", "February", "March", "April", "May", "June", "July", "August", "September", "Oktober", "November", "December"}; Scanner input = new Scanner(System.in); int i = 1; while(i < 13 && i > 0) { System.out.println("Month?"); i = input.nextInt(); if(i > 12 || i < 1) { break; } else { System.out.println(months[i - 1] + "\n"); } } System.out.println("Invalid!");
Vous avez 2 options.
Vous encapsulez l'accès au tableau dans un bloc try-catch et attrapez l'exception, puis imprimez "Invalid".
Vous vous en tenez à ce qui suit: demandez d'abord l'entrée, puis vérifiez si les contraintes sont respectées, et seulement si les contraintes sont respectées, accédez au tableau. Continuez ensuite à faire cela dans la boucle jusqu'à ce que les contraintes ne soient plus satisfaites. (la meilleure option)
Considérez cet exemple de l'option 2:
public static void main(String[] args) { String[] months = new String[] { "January", "February", "March", "April", "May", "June", "July", "August", "September", "Oktober", "November", "December" }; Scanner input = new Scanner(System.in); System.out.println("Month?"); int i = input.nextInt(); while (i < 13 && i > 0) { System.out.println(months[i - 1] + "\n"); System.out.println("Month?"); i = input.nextInt(); } System.out.println("Invalid!"); }
Il n'y a pas besoin de la clause if et du break, car la boucle while fait tout le travail.
Vous pouvez utiliser une boucle infinie (c'est-à-dire while(true){}
) et la casser en cas de InputMismatchException
ou l'entier d'entrée hors de la plage valide (c'est-à-dire 1
à 12
).
Month?10 Oktober Month?1 Januar Month?Abc Invalid
Un exemple d'exécution:
Month?10 Oktober Month?1 Januar Month?15 Invalid
Un autre exemple d'exécution:
import java.time.DateTimeException; import java.time.Month; import java.time.format.TextStyle; import java.util.InputMismatchException; import java.util.Locale; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); while (true) { System.out.print("Month?"); try { Month month = Month.of(input.nextInt()); // Change the locale as per your requirement e.g. Locale.ENGLISH System.out.println(month.getDisplayName(TextStyle.FULL, Locale.GERMAN)); } catch (DateTimeException | InputMismatchException e) { System.out.println("Invalid"); break; } } } }
java.time
:Month?12 December Month?1 January Month?abc Invalid
Un exemple d'exécution:
Month?10 Oktober Month?1 January Month?15 Invalid
Un autre exemple d'exécution:
import java.util.InputMismatchException; import java.util.Scanner; public class Main { public static void main(String[] args) { String[] months = new String[] { "January", "February", "March", "April", "May", "June", "July", "August", "September", "Oktober", "November", "December" }; Scanner input = new Scanner(System.in); int i; while (true) { System.out.print("Month?"); try { i = input.nextInt(); if (i >= 1 && i <= 12) { System.out.println(months[i - 1]); } else { System.out.println("Invalid"); break; } } catch (InputMismatchException e) { System.out.println("Invalid"); break; } } } }
vous devriez essayer quelque chose comme ceci: ------
(si tu ne veux pas casser la boucle)
public static void main(String[] args) { String[] months = new String[] { "January", "February", "March", "April", "May", "June", "July", "August", "September", "Oktober", "November", "December" }; Scanner input = new Scanner(System.in); while (true) { try { System.out.println("Month?"); int inputFromUser = input.nextInt(); if (inputFromUser < 13 && inputFromUser > 0) { System.out.println(months[inputFromUser - 1]); } else { System.out.println("Invalid! input"); System.out.println("Do you want to come out from loop yes/no"); if (input.next().equalsIgnoreCase("yes")) { break; } } } catch (InputMismatchException e) { System.out.println("Invalid! input , please provide the correct integer input"); break; } } input.close(); }
si vous voulez casser la boucle, essayez la logique ci-dessous: -
vérifiez d'abord l'entrée en utilisant "if" puis appliquez la boucle while.
Eh bien, vous utilisez la même variable i pour l'indexation de tableau également, c'est pourquoi vous recevez une exception car avant de sortir de la boucle while pour entrer une entrée invalide, le System.out.println(months[i - 1] + "\n");
doit être exécutée, donc si la valeur de l'index du tableau months[value]
est supérieure à la taille du tableau, vous recevrez une exception pour ArrayIndexOutBoundsException
et également si la valeur de l'index est inférieure à 0
pour éviter cela, ajoutez simplement la if(i>12 || i<1) break;
après l'instruction d'entrée i = input.nextInt();
System.out.println("Invalid!");
donc après avoir entré un nombre supérieur à 12 ou inférieur à 1, la boucle while se rompra
System.out.println("Month?"); i = input.nextInt(); if(i>12 || i<1) break; System.out.println(months[i - 1] + "\n");
exécutera