Validation du type de données saisie.

Fermé
Leilu - Modifié par KX le 16/11/2016 à 18:29
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 16 nov. 2016 à 19:28
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

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
16 nov. 2016 à 19:28
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