Problème : ligne non lue par le programme
Résolu/Fermé
ElexXVII
Messages postés
45
Date d'inscription
dimanche 10 août 2014
Statut
Membre
Dernière intervention
1 juillet 2017
-
30 août 2015 à 16:34
ElexXVII Messages postés 45 Date d'inscription dimanche 10 août 2014 Statut Membre Dernière intervention 1 juillet 2017 - 30 août 2015 à 20:29
ElexXVII Messages postés 45 Date d'inscription dimanche 10 août 2014 Statut Membre Dernière intervention 1 juillet 2017 - 30 août 2015 à 20:29
1 réponse
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
Modifié par KX le 30/08/2015 à 19:58
Modifié par KX le 30/08/2015 à 19:58
Bonjour,
C'est un problème qui revient assez souvent sur le forum.
La méthode nextInt (et d'autres comme nextDouble par exemple) n'attendent pas de sauts de ligne pour lire la donnée or en tapant sur Entrée tu introduis des sauts de lignes qui sont ensuite lus par le nextLine ce qui décale tout.
Exemple avec ton code :
En tapant
Le premier nextInt lit l'entier 10 et s'arrête à l'espace. Tu auras 10 vies.
On affiches le deuxième message pour demander le nombre de mana.
Le deuxième nextInt lit l'entier 10 et s'arrête à l'espace. Tu auras 10 manas. Ici il n'y a pas eu besoin d'attendre que tu tapes quoi que ce soit vu qu'il a récupéré les données de la saisie précédente.
On affiche le message pour demander le nom du deuxième héros.
Puis vient le nextLine, mais même chose, des données sont encore présentes dans le System.in et peuvent être lu, on va récupérer "Heros 2".
Dans l'exemple que tu avais donné, il y avait en réalité deux entrées :
Le premier nextInt a lu 10 et s'est arrêté à la fin de ligne, le deuxième nextInt a lu 10 et s'est arrêté à la fin de ligne, puis le nextLine a lu la fin de ligne, mais il n'y avait rien entre 10 et la fin de ligne donc le nextLine a récupéré une chaîne vide.
Pour éviter ce genre de problème, il faut mettre des nextLine "inutiles" à la suite de chaque nextInt, nextDouble etc. pour forcer à passer à la ligne.
Remarque : une bidouille comme ça peut paraître aberrante mais c'est lié au cas particulier du clavier où tu es obligé d'appuyer sur Entrée pour valider une saisie. Si tu travaillais sur un fichier, il serait plus naturel de prévoir ce genre de cas où l'on a un entier, un saut de ligne, un entier, un saut de ligne, une ligne, etc.La confiance n'exclut pas le contrôle
C'est un problème qui revient assez souvent sur le forum.
La méthode nextInt (et d'autres comme nextDouble par exemple) n'attendent pas de sauts de ligne pour lire la donnée or en tapant sur Entrée tu introduis des sauts de lignes qui sont ensuite lus par le nextLine ce qui décale tout.
Exemple avec ton code :
En tapant
10 10 Heros 2tu ajoutes à System.in les données suivantes :
10 [espace] 10 [espace] Heros [espace] 2 [Fin de ligne]
Le premier nextInt lit l'entier 10 et s'arrête à l'espace. Tu auras 10 vies.
On affiches le deuxième message pour demander le nombre de mana.
Le deuxième nextInt lit l'entier 10 et s'arrête à l'espace. Tu auras 10 manas. Ici il n'y a pas eu besoin d'attendre que tu tapes quoi que ce soit vu qu'il a récupéré les données de la saisie précédente.
On affiche le message pour demander le nom du deuxième héros.
Puis vient le nextLine, mais même chose, des données sont encore présentes dans le System.in et peuvent être lu, on va récupérer "Heros 2".
Dans l'exemple que tu avais donné, il y avait en réalité deux entrées :
10 [Fin de ligne] 10 [Fin de ligne]
Le premier nextInt a lu 10 et s'est arrêté à la fin de ligne, le deuxième nextInt a lu 10 et s'est arrêté à la fin de ligne, puis le nextLine a lu la fin de ligne, mais il n'y avait rien entre 10 et la fin de ligne donc le nextLine a récupéré une chaîne vide.
Pour éviter ce genre de problème, il faut mettre des nextLine "inutiles" à la suite de chaque nextInt, nextDouble etc. pour forcer à passer à la ligne.
System.out.println("Combien aura t'il de vie ?"); int v1 = sc.nextInt(); sc.nextLine(); System.out.println("Combien aura t'il de mana ?"); int m1 = sc.nextInt(); sc.nextLine();
Remarque : une bidouille comme ça peut paraître aberrante mais c'est lié au cas particulier du clavier où tu es obligé d'appuyer sur Entrée pour valider une saisie. Si tu travaillais sur un fichier, il serait plus naturel de prévoir ce genre de cas où l'on a un entier, un saut de ligne, un entier, un saut de ligne, une ligne, etc.La confiance n'exclut pas le contrôle
30 août 2015 à 20:29