La classe Scanner permet de lire plus facilement des informations saisie au clavier en console. Tous les caractères tapées sont stockées dans un tampon. Lorsqu'on fait appel à des méthodes comme nextDouble(), la classe Scanner analyse les caractères qui sont au début du tampon pour vérifer qu'il y a bien des caractères qui forment ce qu'on demande (un double avec nextDouble()) : ces méthodes ignorent automatiquement certains caractères séparateurs (appelés delimiters pour le Scanner), comme les espaces ou les retour-chariot (qui correspondent à la touche entrée), qui se trouve avant les chiffres (et le .) qui vont être utilisés pour le double.
Mais tout ce qui se trouve encore dans le tampon après ce qui a été trouvé pour constituer le double reste dans le tampon, pour pouvoir être traité ensuite.
Or, quand tu saisis un nombre, tu appuis sur la touche entrée juste après pour valider la saisie. Et le retour-chariot qui correspond est mis dans le tampon : donc nextDouble() récupère le nombre mais laisse le retour-chariot. Quand tu fais nextLine() ensuite, ça lit la prochaine ligne de caractères dans le tampon, c'est-à-dire tout ce qu'il y a dans le tampon jusqu'au prochain retour-chariot. Soit une chaine vide (puisque le retour-chariot était juste après le nombre dans ta saisie). Donc quand tu demandes le premier caractère de cette chaîne vide par sc.nextLine().charAt(0) tu obtiens une exception qui dit qu'il n'y a pas de caractère dans la chaine (ou plus exactement qu'il n'y a pas assez de caractères pour obtenir un caractère en position 0).
Partager