1
votes

Comment autoriser l'index hors limites en Java

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!");


0 commentaires

6 Réponses :


0
votes

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");
        }


0 commentaires

0
votes

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!");


0 commentaires

0
votes

Vous avez 2 options.

  1. Vous encapsulez l'accès au tableau dans un bloc try-catch et attrapez l'exception, puis imprimez "Invalid".

  2. 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.


0 commentaires

0
votes

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;
            }
        }
    }
}

En utilisant l'API 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;
            }
        }
    }
}


0 commentaires

0
votes

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.


0 commentaires

0
votes

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


0 commentaires