59 votes

Problème de numérisation lors de l'utilisation de nextLine après nextXXX

J'ai rencontré un problème lorsque j'essaie d'obtenir l'entrée de l'utilisateur en utilisant Scanner :

import java.util.Scanner;

public class Main
{
    public static Scanner input = new Scanner(System.in);
    public static void main(String[] args)
    {
        System.out.print("Insert a number: ");
        int number = input.nextInt();
        System.out.print("Text1: ");
        String text1 = input.nextLine();
        System.out.print("Text2: ");
        String text2 = input.nextLine();
    }
}

Sortie :

Insert a number: 55
Text1: Text2: Hi there!

Comme vous pouvez le voir, le programme a sauté String text1 = input.nextLine(); . Quel est le problème ici ? et comment résoudre ce problème ?

244voto

Prine Points 3573

Le problème se situe au niveau de la input.nextInt() elle ne lit que la valeur int. Ainsi, lorsque vous poursuivez la lecture avec input.nextLine(), vous recevez le " \n " Touche d'entrée. Pour éviter cela, vous devez donc ajouter l'option input.nextLine() . J'espère que cela devrait être clair maintenant.

Essayez comme ça :

System.out.print("Insert a number: ");
int number = input.nextInt();
input.nextLine(); // This line you have to add (It consumes the \n character)
System.out.print("Text1: ");
String text1 = input.nextLine();
System.out.print("Text2: ");
String text2 = input.nextLine();

74voto

Bohemian Points 134107

C'est parce que lorsque vous entrez un numéro puis appuyez sur Enter , input.nextInt() ne consomme que le numéro, pas la "fin de ligne". Lorsque input.nextLine() s'exécute, elle consomme la "fin de ligne" encore dans le tampon de la première entrée.

Au lieu de cela, utilisez input.nextLine() immédiatement après input.nextInt()

44voto

Denis Tulskiy Points 10444

Il semble y avoir beaucoup de questions sur ce sujet avec java.util.Scanner . Je pense qu'une solution plus lisible/idiomatique serait d'appeler scanner.skip("[\r\n]+") pour supprimer tout caractère de nouvelle ligne après l'appel nextInt() .

EDIT : comme @PatrickParker l'a noté ci-dessous, cela provoquera une boucle infinie si l'utilisateur saisit un espace après le nombre. Voir sa réponse pour un meilleur modèle à utiliser avec skip : https://stackoverflow.com/a/42471816/143585

30voto

Electric Coffee Points 1694

Il le fait parce que input.nextInt(); ne capture pas la nouvelle ligne. Vous pourriez faire comme les autres proposés en ajoutant un input.nextLine(); en dessous.
Vous pouvez aussi le faire à la manière de C# et analyser une ligne suivante en un nombre entier comme suit :

int number = Integer.parseInt(input.nextLine()); 

Cela fonctionne tout aussi bien et vous permet d'économiser une ligne de code.

11voto

Castaldi Points 15

Au lieu de input.nextLine() utilice input.next() cela devrait résoudre le problème.

Code modifié :

public static Scanner input = new Scanner(System.in);

public static void main(String[] args)
{
    System.out.print("Insert a number: ");
    int number = input.nextInt();
    System.out.print("Text1: ");
    String text1 = input.next();
    System.out.print("Text2: ");
    String text2 = input.next();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X