Hello,
Scanner n'est pas fait pour mélanger nextLine() et nextAutreChose().
Il faut choisir,
- ou bien tu appelles nextLine() et seulement nextLine()
- ou bien tu appelles seulement nextInt(), next(), nextDouble() et tout le toutim mais jamais nextLine()
- ou bien il va falloir faire des trucs qui ont l'air bizarre et sur lesquels on peut se tromper facilement.
La raison en est :
- nextInt() lit en s'attendant à trouver un int, lit ce int, puis arrête sa lecture.
- next() veut renvoyer un String. Il lit jusqu'à trouver quelque chose qui n'est pas un blanc, puis il lit jusqu'à tomber à nouveau sur un blanc, et il renvoie ce qu'il a trouvé entre les deux.
- nextLine() renvoie tout ce qui se trouve entre maintenant et la prochaine fin de ligne.
Donc, si ton entrée est
5 <fin de ligne 1>
Paul <fin de ligne 2>
et que tu appelles nextInt() puis nextLine(),
nextInt() renvoie 5 et s'arrête là,
puis nextLine() lit ce qu'il y a après et avant la fin de ligne 1, c'est-à-dire rien ou du blanc.
Ensuite la prochaine chose à lire est Paul. Mais nextLine() a fini son boulot, là. Ce n'est pas à lui de lire la suite.
Solution :
Vu que tu lis un nom, je suppose que ce nom a droit aux espaces, donc tu es forcé d'utiliser nextLine(), vu que next() ne convient pas pour lire un nom avec des espaces.
Il faut donc utiliser nextLine() et seulement nextLine(). Donc remplacer tous les nextInt() par nextLine(). Seulement voilà, ça ne donne pas un int mais une String.
Donc il faut ensuite convertir cette String en int :
int nCl1 = Integer.parseInt(sc.nextInt());
Autre solution : consommer la fin de ligne après chaque appel de nextAutreChose(). Autrement dit, appeler nextLine() après chaque appel à nextInt() :
1 2
| int nCl1 = sc.nextInt();
sc.nextLine(); |
Bien sûr il ne faut jamais oublier de le faire.
Partager