IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

forcer l'utilisateur à entrer un nombre


Sujet :

avec Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 4
    Points
    4
    Par défaut forcer l'utilisateur à entrer un nombre
    Salut à tous!

    Je débute un peu en Java et j'ai commencé à faire un petit programme tout simple.
    En gros, je demande à l'utilisateur d'entrer une valeur entière entre 1 et 5 et j'affiche bêtement cette valeur.
    J'ai réussi à faire en sorte que la question lui soit reposée s'il entre une valeur supérieur à 5 ou inférieur à 1.
    J'ai utilisé la fonction switch .
    Le problème est que si l'utilisateur entre un caractère au lieu d'un entier rien ne se passe et des lignes de code d'erreur apparaissent dans mon IDE.

    Sauriez-vous comme je peux redemander à l'utilisateur de choisir une valeur entière entre 1 et 5 si jamais il entre un caractère?

    J'espère avoir été assez clair, dites le moi si c'est pas le cas.

    Merci!

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ben tu attrape l'erreur avec un catch (car je suppose qu'on parle d'une exception) et tu repose la question

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Ah oui cool ça marche, merci

    Mais petite question en regardant sur internet j'ai vu qu'il fallait mettre e après le type exception dans le catch : catch (InputMismatchException e).
    A quoi correspond ce e ?

    Merci en tout cas c'est pas mal ce catch

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    En fait j'ai parlé un peu trop vite, ça marche pour certaines ligne du code mais pas pour d'autres (je sais c'est bizzare).
    Tu comprendras surement mieux si je te donne mon code (soit indulgent...je suis débutant lol).

    Lorsque je demande le "Numéro du compte" (ligne 82) et que j'entre la valeur k par exemple j'obtient les lignes de problèmes d'exception.
    Pourtant mon premier catch marche (ligne 54) marche très bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    package projetbancaire;
     
    import java.util.InputMismatchException;
    import java.util.Scanner;
     
     
    public class ProjetBancaire {
     
        public static byte menuprincipal(){
            byte tmp=0;
     
            System.out.println("1. créer un compte");
            System.out.println("2. Afficher un compte");
            System.out.println("3. Créer une ligne comptable");
            System.out.println("4. Sortir" );
            System.out.println("5. De l'aide");
            System.out.println(" ");
            System.out.println("Numéro de votre Choix : ");
     
            Scanner scan = new Scanner(System.in); 
     
            tmp=scan.nextByte();
            return tmp;
            }
     
        public static void sortir(){
            System.out.println("Merci et au revoir");
            System.exit(0);
        }
     
        public static void alaide(){
            System.out.println("1. créer un compte : permet de créer un compte ");
            System.out.println("         Tapez C pour compte courant");
            System.out.println("         Tapez J pour compte joint");
            System.out.println("         Tapez E pour compte épargne");
            System.out.println("         Puis, entrez le numéro de compte");
            System.out.println("         Ensuite, la première valeur créditée");
            System.out.println("         Enfin, dans le cas d'un compte épargne, tapez le taux de placement");
            System.out.println("2. Afficher un compte : permet d'afficher les données d'un compte");
            System.out.println("3. Créer une ligne comptable : permet de créer une ligne comptable");
            System.out.println("4. Sortir : permet de quitter programme");
            System.out.println("5. De l'aide : fournit une description des choix possibles");
        }
     
        public static void main(String[] args) {
            byte choix=0; 
            char typecompte='\0';
            double valcredite=0;
            long numcompte=0, numcomptelu=0;
            float taux=0;
            Scanner scan = new Scanner(System.in);
     
            do {
             try{
                choix=menuprincipal(); 
             } catch(InputMismatchException e) {
                 System.out.println("Choisissez une option entre 1 et 5");
                 System.out.println("");
                 choix=menuprincipal();
             }
     
     
              switch(choix)
           {
                    case 1:
                        //Option 1//
     
                        do
                        {    
     
                        System.out.println("Type du compte [Types possibles : C(ourant), J(oint), E(pargne)] : ");
                        typecompte=scan.next().charAt(0);
                            if(typecompte!='C' && typecompte!='J' && typecompte!='E'){
                               System.out.println("Choisissez parmi les possibilités proposées");
                               System.out.println("");
                            }
     
                        }
                        while (typecompte!='C' && typecompte!='J' && typecompte!='E');
     
     
                        System.out.println("Numéro de compte : ");
                        try{
                            numcompte=scan.nextLong();
                        } catch(InputMismatchException e) {
                 System.out.println("Entrez le numéro de votre compte");
                 System.out.println("");
                 System.out.println("Numéro de compte : ");
                 numcompte=scan.nextLong();
             }
     
                        System.out.println("Première valeur créditée : ");
                        try{
                            valcredite=scan.nextDouble();
                        } catch(InputMismatchException e) {
                            System.out.println("Entrez la première valeur créditée");
                            System.out.println("");
                            System.out.println("Première valeur créditée : ");
                            valcredite=scan.nextDouble();
                        }
                             if (typecompte=='E')
                            {
                          //si compte epargne  
                             System.out.println("Taux de placement (en %) : ");
                             taux=scan.nextFloat();  
                            }  
     
     
                        break;
     
                    case 2:
                        //Option 2
                        System.out.print("Quel compte souhaitez vous afficher? : ");
                        numcomptelu=scan.nextLong();
     
                      if(numcomptelu==numcompte)
                      {    
                         System.out.print("Le compte n° " + numcompte + " est un compte " );
                         if(typecompte=='C')
                         {
                             System.out.print("courant,");
                         }    
     
                         else if(typecompte=='J')
                         {
                             System.out.print("joint");
                         }    
     
                         else if(typecompte=='E')
                         {
                              System.out.println("epargne dont le taux est : " + taux + '%');
                         }    
     
     
     
                        System.out.println("La première valeur créditée est : " + valcredite);
                      }  
                     else
                     {   
                           System.out.println("Le n° de compte " + numcomptelu +" n'est pas reconnu");
                       }
                         break;
     
                    case 3:
                        //Option 3
                        System.out.println("option non programée");
                        break;
     
                    case 4:
                        //Option 4
                        sortir();
                        break;
     
                    case 5:
                        //Option 5
                        alaide(); 
                        break;
     
                    default : {
                        System.out.println("Veuillez entrez le numéro de votre choix");
                        System.out.println("");        
                    }
     
                 }
                }  
     
                 while(choix>=1 || choix<=5 || choix!=4);
        }
     
    }

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par souchi63 Voir le message
    Mais petite question en regardant sur internet j'ai vu qu'il fallait mettre e après le type exception dans le catch : catch (InputMismatchException e).
    A quoi correspond ce e ?
    C'est le nom de la variable qui permet d'accéder à l'exception, pour faire des trucs comme e.printStackTrace(); ou throw new IOException(e.getMessage(), e);.
    Tu pourrais mettre zorglub à la place de e que ça serait pareil.

    Citation Envoyé par souchi63 Voir le message
    Lorsque je demande le "Numéro du compte" (ligne 82) et que j'entre la valeur k par exemple j'obtient les lignes de problèmes d'exception.
    Pourtant mon premier catch marche (ligne 54) marche très bien.
    Ah oui, tiens. Quand un Scanner envoie un InputMismatchException il fait comme si on ne lui avait pas demandé de lire. Donc la mauvaise entrée est toujours là et il faut s'en débarrasser, en appelant next() par exemple.

    La différence entre tes deux cas, vient de ce que tu fais avec les Scanner. Tu n'arrêtes pas de faire des new Scanner. Là ça t'avait porté chance, mais il ne faut pas, parce que c'est aléatoire et que c'est pas prévu pour marcher.
    Il n'y a qu'une seule entrée standard, donc tu ne peux faire qu'un seul new Scanner(System.in). Il faut le faire une seule fois au début du programme, en dehors des boucles, et plus jamais.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Je rajoute aussi, tu ne devrais pas, dans le catch, refaire un appel au scanner car, que se passera-t-il si l'entrée suivante est aussi mauvaise? Comme tu n'es plus dans le try, l'erreur remontera, ce que tu ne veux pas. Tu dois utiliser ce genre de pattern:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    long choix = -1;
     
    while (choix<0 || choix > 5){
        afficherMenu();
        try{
          choix=scanner.nextLong();
        } catch (InputMismatchException e){
           System.out.println(scanner.next()+" n'est pas une valeur valide entre 1 et 5");
        }
    }

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par thelvin Voir le message

    Ah oui, tiens. Quand un Scanner envoie un InputMismatchException il fait comme si on ne lui avait pas demandé de lire. Donc la mauvaise entrée est toujours là et il faut s'en débarrasser, en appelant next() par exemple.

    La différence entre tes deux cas, vient de ce que tu fais avec les Scanner. Tu n'arrêtes pas de faire des new Scanner. Là ça t'avait porté chance, mais il ne faut pas, parce que c'est aléatoire et que c'est pas prévu pour marcher.
    Il n'y a qu'une seule entrée standard, donc tu ne peux faire qu'un seul new Scanner(System.in). Il faut le faire une seule fois au début du programme, en dehors des boucles, et plus jamais.
    Je t'avoue que j'y avais pensé à mettre le Scanner scan = new Scanner(System.in) au tout début du programme mais le pb c'est que ça n'a pas l'air de marcher.
    Mes scan. ne sont pas reconnus dans la suite du programme (non static variable scan cannot be referenced from a static context).

    Par contre je ne comprends pas ce que tu veux dire par c'est aléatoire et pas prévu pour marcher?

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par souchi63 Voir le message
    Je t'avoue que j'y avais pensé à mettre le Scanner scan = new Scanner(System.in) au tout début du programme mais le pb c'est que ça n'a pas l'air de marcher.
    Si si, c'est le reste qui ne marche pas.

    Citation Envoyé par souchi63 Voir le message
    Mes scan. ne sont pas reconnus dans la suite du programme (non static variable scan cannot be referenced from a static context).
    Une solution simple serait de faire que la variable scan soit static. D'habitude on évite les static à outrance, mais vu qu'elle est censée être créée une fois et une seule dans le programme, là il n'y a pas de raison de s'en priver.

    Citation Envoyé par souchi63 Voir le message
    Par contre je ne comprends pas ce que tu veux dire par c'est aléatoire et pas prévu pour marcher?
    Ben "aléatoire" : ça fait n'importe quoi, on peut pas prévoir le résultat à l'avance, tout dépend où on en est de la milliseconde en cours, du jour de la semaine et de la phase de la lune.

    "pas prévu pour marcher" : Scanner est conçu pour être utilisé d'une façon précise. Et tu ne t'en sers pas de cette façon. Il n'y a pas de raison d'espérer que ta façon marche, puisque ce n'est pas celle prévue. Cela peut arriver quand même, par hasard, quand on a de la chance.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Ok, je vais essayer de voir comment on le rend static.
    Donc en gros ça je peux le faire à chaque fois que j'utilise des scanner pour le mettre en début de programme?
    Ca m'évitera de faire des new scanner toutes les 3 lignes c'est ça?

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Je rajoute aussi, tu ne devrais pas, dans le catch, refaire un appel au scanner car, que se passera-t-il si l'entrée suivante est aussi mauvaise? Comme tu n'es plus dans le try, l'erreur remontera, ce que tu ne veux pas. Tu dois utiliser ce genre de pattern:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    long choix = -1;
     
    while (choix<0 || choix > 5){
        afficherMenu();
        try{
          choix=scanner.nextLong();
        } catch (InputMismatchException e){
           System.out.println(scanner.next()+" n'est pas une valeur valide entre 1 et 5");
        }
    }
    Oui tu as raison après une fois j'ai de nouveau la ligne d'exception c'est logique.
    Merci

  11. #11
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par souchi63 Voir le message
    Ok, je vais essayer de voir comment on le rend static.
    Donc en gros ça je peux le faire à chaque fois que j'utilise des scanner pour le mettre en début de programme?
    Ca m'évitera de faire des new scanner toutes les 3 lignes c'est ça?
    Yup. Après, rien ne t'empêche de le créer non-static et de le passer à tous les objets qui en ont besoin. Mais bon, pour une fois que static peut s'utiliser correctement...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Forcer l'utilisateur a saisir du numerique dans un input type="text"
    Par scraly dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 02/06/2016, 21h30
  2. [JOptionPane] [JDialog] forcer l'utilisateur à entrer une valeur
    Par MatPhD dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 01/08/2007, 18h45
  3. Réponses: 2
    Dernier message: 29/08/2006, 10h44
  4. Forcer un utilisateur a saisir [a-z] dans une txtbox
    Par fabrice518 dans le forum IHM
    Réponses: 2
    Dernier message: 26/10/2005, 14h29
  5. Réponses: 4
    Dernier message: 14/09/2005, 15h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo