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
Bonjour, je commence a peine a programmer en java, et j'ai fait un petit programme, pour essayer les différentes fonctionnalité qu'offre Java. Mais je me heurte a un problème :

Voila mon code
public static void main(String[] args) 
	{
		String pHeros;
		String pPouvoir;
		int pHealth;
		int pMana;
		
		Scanner sc = new Scanner(System.in);
		
		System.out.println("Menu de creation de heros :\n");
		
		System.out.println("Heros n'1 :");
		
		System.out.println("Quel sera son nom ?");
		String n1 = sc.nextLine();
		
		System.out.println("Quel sera le nom de son pouvoir ?");
		String p1 = sc.nextLine();
		
		System.out.println("Combien aura t'il de vie ?");
		int v1 = sc.nextInt();
		
		System.out.println("Combien aura t'il de mana ?");
		int m1 = sc.nextInt();
	
		pHeros = n1;
		pPouvoir = p1;
		pHealth = v1;
		pMana = m1;
		
			Heros h1 = new Heros(pHeros, pPouvoir, pHealth, pMana);
		
		System.out.println("Heros n'2 :");
		
		System.out.println("Quel sera son nom ?");
                //Mon probleme est ici :
		String n2 = sc.nextLine(); //Cette ligne n'est pas lue, et je ne comprend pas pk ?
		
		System.out.println("Quel sera le nom de son pouvoir ?");
		String p2 = sc.nextLine();
		
		System.out.println("Combien aura t'il de vie ?");
		int v2 = sc.nextInt();
		
		System.out.println("Combien aura t'il de mana ?");
		int m2 = sc.nextInt();
		
		pHeros = n2;
		pPouvoir = p2;
		pHealth = v2;
		pMana = m2;
		
			Heros h2 = new Heros(pHeros, pPouvoir, pHealth, pMana);
		}


Voila ce qui se passe quand je le lance :


Pour la création du deuxième "Heros" (Heros 2), le programme ne me laisse pas entrer son "nom", qqun aurait une solution ?

Merci d'avance

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
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
10 10 Heros 2
tu 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
0
ElexXVII Messages postés 45 Date d'inscription dimanche 10 août 2014 Statut Membre Dernière intervention 1 juillet 2017 1
30 août 2015 à 20:29
Merci de m'avoir éclairer ! , je vais pouvoir continuer mon apprentissage ;)
0