Validation du type de données saisie.

Leilu -  
KX Messages postés 19031 Statut Modérateur -
Bonjour,
Je suis débutante avec java, j'apprend à programmer et je suis butter devant un problème.
voici une partie de mon code qui sert à calculer des primes d'assurance.

  Scanner demandeInformation = new Scanner(System.in);

        do {
            System.out.println("Quel est votre sexe  ? (h/f) ");
            client.sexe = demandeInformation.next();
        }
        while ((!Objects.equals(client.sexe, "h")) && (!Objects.equals(client.sexe, "f"))); // boucle de condition pour s'assurer que la données entrées est == à "h" ou == à "f"

        do {
            System.out.println("Quel est votre âge ? ");
            client.age = demandeInformation.nextInt();
        }
        while ((client.age <= 0) || (client.age > 110)); // boucle de condition pour s'assurer que la valeur de client.age est inférieur à 110 ans et supérieur à zéro.

        do {
            System.out.println("Quelle est la valeur d'achat de votre véhicule ? ");
            client.valeurAchat = demandeInformation.nextDouble();
        }
        while (client.valeurAchat <= 0); // Boucle de condition pour s'assurer que la valeur de client.valeurAchat est supérieur à Zéro.

        do {
            System.out.println("Quell est l'année de fabrication de votre véhicule ? ");
            client.anneeFabrication = demandeInformation.nextInt();
        }
        while ((client.anneeFabrication <= 0) || (client.anneeFabrication > client.anneeEnCours)); // Boucle de condition pour s'assurer que l'année de fabrication est supérieur à Zéro et inférieur à l'année en cours.

        do {
            System.out.println("Avex-vous fait des réclamation au cours des 6 dernières anées ? (oui/non) ");
            client.reclamationPrecedantes = demandeInformation.next();
        }
        while ((!Objects.equals(client.reclamationPrecedantes, "oui")) && (!Objects.equals(client.reclamationPrecedantes, "non")));


Lorsque par exemple on entre des chiffres lorsqu'on demande le sexe, le programme plante. J'aimerais qu'il ne fasse que continuer à demander la question. La boucle do....while que j'ai fait exécute le même travail si on entre autre chose que "h" ou "f". Est-ce qu'il est possible d'ajouter une condition pour m'assurer que le type est respecté.

Merci.

1 réponse

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Bonjour,

    En Java 8 il est très facile de faire ce genre de tests avec une petite méthode utilitaire, exemple :

    // import java.util.function.*;
    public static <E> E getAndCheck(String msg, Supplier<E> getter,
            Function<E, Boolean> condition) {
        E result = null;
        do {
            System.out.println(msg);
            try {
                result = getter.get();
            } catch (RuntimeException e) {
            }
        } while (result == null || !condition.apply(result));
        return result;
    }

    // import java.util.Scanner;
    Scanner sc = new Scanner(System.in);
    
    client.sexe = getAndCheck(
            "Quel est votre sexe ? (h/f)",
            sc::nextLine,
            r -> r.equals("h") || r.equals("f"));
    client.age = getAndCheck(
            "Quel est votre âge ?",
            () -> Integer.parseInt(sc.nextLine()),
            r -> r > 0 && r <= 110);
    client.valeurAchat = getAndCheck(
            "Quelle est la valeur d'achat de votre véhicule ?",
            () -> Double.parseDouble(sc.nextLine()),
            r -> r > 0);
    client.anneeFabrication = getAndCheck(
            "Quelle est l'année de fabrication de votre véhicule ?",
            () -> Integer.parseInt(sc.nextLine()),
            r -> r > 0 && r <= client.anneeEnCours);
    client.reclamationsPrecedentes = getAndCheck(
            "Avez-vous fait des réclamations au cours des 6 dernières années ? (oui/non)",
            sc::nextLine,
            r -> r.equals("oui") || r.equals("non"));
    0