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 :

Erreur Scanner : nextInt()


Sujet :

avec Java

  1. #1
    Nouveau Candidat au Club
    Erreur Scanner : nextInt()
    Bonjour,

    Je sais que beaucoup de gens ont déjà rencontré ce problème, j'ai regardé leurs solutions mais je ne comprend pas pourquoi ca ne fonctionne toujours pas ...

    la première valeur que je rentre fonctionne mais à la deuxième j'ai une erreur :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Scanner scPosition = new Scanner( System.in );
            while((nouvellePosition<positionInf) || (nouvellePosition>positionSup))
            {
                System.out.println("scanner  : "+scPosition);
                System.out.println("nouvelle Position  : ");
                nouvellePosition=scPosition.nextInt();
                scPosition.nextLine();
            }
            System.out.println("Tu as choisis : " + nouvellePosition);
     scPosition.close();


    Je me suis dis que peut être en affichant le contenu du scanner que j'ai nommé scPosition pour m'aider à comprendre le problème :
    Avant la première fois que je rentre un nombre scPosition m'affiche :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    scanner  : java.util.Scanner
    [delimiters=\p{[match valid=false][need input=false][sourc][group separator=\x{202f}]
    [decimal separatnegative prefix=\Q-\E][positive suffix=][neNaN\E][infinity string=\Q?\E]


    Avant lorsque je redemande le scanner scPosition m'affiche cela :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    scanner  : java.util.Scanner
    [delimiters=\p{javaWhitespace}+][position=0][match valid=false][need input=false][source closed=false][skipped=false][group separator=\x{202f}]
    [decimal separator=\x{2c}][positive prefix=][negative prefix=\Q-\E][positive suffix=][negative suffix=][NaN string=\QNaN\E][infinity string=\Q?\E]


    Et ensuite j'ai l'erreur :


  2. #2
    Membre actif
    Bonjour,

    Peux-tu copier l'intégralité de ton code source, s'il te plaît ?

  3. #3
    Nouveau Candidat au Club
    Citation Envoyé par transact Voir le message
    Bonjour,

    Peux-tu me faire copier l'intégralité de ton code source, s'il te plaît ?
    L'intégralité... Ca sera compliqué car il est splité en plein de gros morceau de code

    J'appel juste une fonction qui demande à l'utilisateur de saisir un int et j'ai cette erreur...

    Je te renvoie la fonction en question :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int positionInf = getPositionInf(numeroJoueur);//Me renvoie 1 
            int positionSup = getPositionSup(numeroJoueur);//Me renvoie 3 
            int nouvellePosition=-1;
     
            Scanner scPosition = new Scanner( System.in );
            while((nouvellePosition<positionInf) || (nouvellePosition>positionSup))
            {
                System.out.println("scanner  : "+scPosition);//Affichage de scPosition
                System.out.println("nouvelle Position  : ");
                nouvellePosition=scPosition.nextInt();//La ligne où mon erreur apparait...
                scPosition.nextLine();//Sur les forums on dit qu'il faut ajouter cette ligne... Mais ca ne marche toujours pas
            }
            System.out.println("Tu as choisis : " + nouvellePosition);
            scPosition.close();

  4. #4
    Membre expérimenté
    Bonjour,

    Dans l'API de Scanner il est indiqué :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    @throws NoSuchElementException if input is exhausted


    Autrement dit, l'entrée est vide. Il est possible de tester avant lecture avec sc.hasNext() ou sc.hasNextInt() par exemple.

  5. #5
    Nouveau Candidat au Club
    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
    int positionInf = getPositionInf(numeroJoueur);
            int positionSup = getPositionSup(numeroJoueur);
            int nouvellePosition=-1;
     
            Scanner scPosition = new Scanner( System.in );
            while((nouvellePosition<positionInf) || (nouvellePosition>positionSup))
            {
                System.out.print("nouvelle Position  : ");
                if(scPosition.hasNextInt())
                {
                    nouvellePosition=scPosition.nextInt();
                }
     
            }
            System.out.println("Tu as choisis : " + nouvellePosition);


    Je viens d'implémenter ce code...
    Ca fonctionne la première fois mais la deuxième fois, j'ai une boucle infinie qui m'affiche "nouvelle Position :"
    Pourquoi je n'ai pas une méthode bloquante quelques part pour que je puisse rentrer un nouveau nombre...?

  6. #6
    Membre expérimenté
    Citation Envoyé par nthCode Voir le message

    Ca fonctionne la première fois mais la deuxième fois, j'ai une boucle infinie qui m'affiche "nouvelle Position :"
    Pourquoi je n'ai pas une méthode bloquante quelques part pour que je puisse rentrer un nouveau nombre...?
    La méthode bloquante est le nextInt(). Mais le hasNextInt() empêche son exécution.

  7. #7
    Nouveau Candidat au Club
    C'est à dire ?
    Ma boucle while est une sécurité pour pas que l'utilisateur puisse entrer un chiffre < à 1 ou > à 3
    Lors de mon premier appel, je rentre bien un chiffre et modifie la variable nouvellePosition puis
    lors du second appel j'ai une boucle infinie si j'implémente le scPosition.hasNextInt(), car je ne modifie pas la variable nouvellePosition initialisé à -1 au début de ma fonction...
    Si je ne met pas ta solution scPosition.hasNextInt(), j'ai mon erreur du début...

    Par ailleurs que test le hasNextInt() ?

  8. #8
    Membre actif
    Par ailleurs que test le hasNextInt() ?
    La méthode hasNextInt() teste que la prochaine entrée affichée sur la sortie standard est un nombre entier valide, si tel est le cas la méthode hasNextInt() renvoi true.

    Concernant ton code,
    Code Java :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Scanner scPosition = new Scanner( System.in );
    while((nouvellePosition<positionInf) || (nouvellePosition>positionSup))
            {
                System.out.print("nouvelle Position  : ");
                if(scPosition.hasNextInt())
                {
                    nouvellePosition=scPosition.nextInt();
                }
     
            }


    tu devrais plutôt tester la condition suivante :

    Code Java :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Scanner scPosition = new Scanner( System.in );
    while((nouvellePosition<positionInf) || (nouvellePosition>positionSup) && scPosition.hasNextInt()) {
        System.out.print("nouvelle Position  : ");            
        nouvellePosition=scPosition.nextInt();    
        System.out.print(" -> " + scPosition.next() + "\n"); // tester ce qui est affiché
    }
    scPosition.close();

  9. #9
    Nouveau Candidat au Club
    Bonjour transact !

    Ta solution ne fonctionne pas... J'ai implémenter ce code et j'ai toujours une erreur
    Ca fonctionne lors du premier appel mais pas du Second !
    J'ai une boucle infinie... Je crois

    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
     
     
    import java.util.Scanner;
     
    public class Test {
     
        public static int getNouvellePosition()
        {
            int nouvellePosition=-1;
            int positionInf=1;
            int positionSup=3;
     
     
            Scanner scPosition = new Scanner( System.in );
     
            while((nouvellePosition<positionInf) || (nouvellePosition>positionSup) && scPosition.hasNextInt()) {
                System.out.print("nouvelle Position  : ");            
                nouvellePosition=scPosition.nextInt();    
                System.out.print(" -> " + scPosition.next() + "\n"); // tester ce qui est affiché
            }
            scPosition.close();
     
            return nouvellePosition;
        }
     
     
        public static void main(String[] args) {
     
            int position =0;
     
            System.out.println("position " + position);
     
            position=Test.getNouvellePosition();
     
            System.out.println("position MAj 1 -> " + position);
     
            position=Test.getNouvellePosition();
     
            System.out.println("position MAj 2 -> " + position);
        }
     
    }

  10. #10
    Nouveau Candidat au Club
    Je viens de trouvé une solution mais le problème ici c'est que je ne close jamais le scanner...
    Dans cette solution peut accéder plusieurs à ma méthode getNouvellePosition(), c'est ce que j'essai d'obtenir comme résultat...

    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
     
    import java.util.Scanner;
     
    public class Test {
     
        public static int getNouvellePosition() {
            int nouvellePosition = 0;
     
            Scanner scPosition = new Scanner(System.in);
     
            System.out.print("nouvelle Position  : ");
     
     
            if (scPosition.hasNextInt()) {
                nouvellePosition = scPosition.nextInt();
                scPosition.nextLine();
            }
     
            return nouvellePosition;
        }
     
     
        public static void main(String[] args) {
     
            int position =0;
            int positionInf=1;
            int positionSup=3;
     
            System.out.println("position de depart " + position);
     
            //Mise a jour position 2
            do
            {
                position=Test.getNouvellePosition();
                System.out.println("position MAj 1 -> " + position);
            }while(position<positionInf || position >positionSup);
     
            //Mise a jour position 1
            do
            {
                position=Test.getNouvellePosition();
                System.out.println("position MAj 2-> " + position);
            }while(position<positionInf || position >positionSup);
     
            System.out.println("process termine");
        }
     
    }

  11. #11
    Membre actif
    Utilise plutôt un traitement try-with-resources en y mettant ton Scanner comme cela tu n'auras pas à faire un close de ton Scanner.

###raw>template_hook.ano_emploi###