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 :

Erreur Scanner : nextInt()


Sujet :

avec Java

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2020
    Messages : 11
    Par défaut 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 :

    Nom : Capture.PNG
Affichages : 534
Taille : 13,1 Ko

  2. #2
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    Bonjour,

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

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2020
    Messages : 11
    Par défaut
    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 émérite Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 593
    Par défaut
    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
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2020
    Messages : 11
    Par défaut
    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 émérite Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 593
    Par défaut
    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
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2020
    Messages : 11
    Par défaut
    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 chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    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
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2020
    Messages : 11
    Par défaut
    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
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2020
    Messages : 11
    Par défaut
    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 chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    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.

Discussions similaires

  1. scanner.nextLine après scanner.nextInt
    Par stracoma dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 01/09/2015, 22h51
  2. Erreur "scanner cannot be resolved to a type"
    Par Garigliano dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 15/06/2013, 00h20
  3. [WD15] erreur sur un code pour scanner
    Par fr832 dans le forum WinDev
    Réponses: 4
    Dernier message: 07/09/2011, 21h15
  4. Erreur avec nextInt()
    Par Steve.j dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 09/01/2010, 00h33
  5. Erreur sous eclipse avec Scanner
    Par bugland dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 11/01/2007, 15h28

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