97 votes

Utilisation de scanner.nextLine()

J'ai eu des problèmes en essayant d'utiliser la méthode nextLine() de java.util.Scanner.

Voici ce que j'ai essayé :

import java.util.Scanner;

class TestRevised {
    public void menu() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Enter a sentence:\t");
        String sentence = scanner.nextLine();

        System.out.print("Enter an index:\t");
        int index = scanner.nextInt();

        System.out.println("\nYour sentence:\t" + sentence);
        System.out.println("Your index:\t" + index);
    }
}

Exemple n° 1 : Cet exemple fonctionne comme prévu. La ligne String sentence = scanner.nextLine(); attend la saisie des données avant de passer à l'étape suivante. System.out.print("Enter an index:\t"); .

Cela produit la sortie :

Enter a sentence:   Hello.
Enter an index: 0

Your sentence:  Hello.
Your index: 0

// Example #2
import java.util.Scanner;

class Test {
    public void menu() {
        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.println("\nMenu Options\n");
            System.out.println("(1) - do this");
            System.out.println("(2) - quit");

            System.out.print("Please enter your selection:\t");
            int selection = scanner.nextInt();

            if (selection == 1) {
                System.out.print("Enter a sentence:\t");
                String sentence = scanner.nextLine();

                System.out.print("Enter an index:\t");
                int index = scanner.nextInt();

                System.out.println("\nYour sentence:\t" + sentence);
                System.out.println("Your index:\t" + index);
            }
            else if (selection == 2) {
                break;
            }
        }
    }
}

Exemple n° 2 : Cet exemple ne fonctionne pas comme prévu. Cet exemple utilise une boucle while et une structure if - else pour permettre à l'utilisateur de choisir ce qu'il veut faire. Une fois que le programme arrive à String sentence = scanner.nextLine(); il n'attend pas l'entrée mais exécute la ligne System.out.print("Enter an index:\t"); .

Cela produit la sortie :

Menu Options

(1) - do this
(2) - quit

Please enter your selection:    1
Enter a sentence:   Enter an index: 

Ce qui rend impossible l'entrée d'une phrase.


Pourquoi l'exemple n° 2 ne fonctionne-t-il pas comme prévu ? La seule différence entre les exemples 1 et 2 est que l'exemple 2 comporte une boucle while et une structure if-else. Je ne comprends pas pourquoi cela affecte le comportement de scanner.nextInt().

0 votes

0 votes

Dans l'exemple # 2, avant cette ligne String sentence = scanner.nextLine() ; ajouter la ligne suivante sc.nextLine() ;

126voto

Peter Lawrey Points 229686

Je pense que votre problème est que

int selection = scanner.nextInt();

ne lit que le numéro, pas la fin de la ligne ou quoi que ce soit après le numéro. Lorsque vous déclarez

String sentence = scanner.nextLine();

Cela lit le reste de la ligne contenant le numéro (sans rien après le numéro, je suppose).

Essayez de placer un scanner.nextLine() ; après chaque nextInt() si vous avez l'intention d'ignorer le reste de la ligne.

5 votes

C'est correct. Le retour chariot n'est pas consommé par nextInt . La solution de contournement consiste à utiliser votre solution ou à utiliser un modèle pour inclure les CR et les autres délimiteurs.

22voto

berdario Points 490

Plutôt que de placer un scanner.nextLine() à chaque fois que vous voulez lire quelque chose, puisqu'il semble que vous voulez accepter chaque entrée sur une nouvelle ligne, vous pourriez vouloir changer le délimiteur pour qu'il ne corresponde qu'aux nouvelles lignes (au lieu de tout espace, comme c'est le cas par défaut).

import java.util.Scanner;

class ScannerTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        scanner.useDelimiter("\\n");

        System.out.print("Enter an index: ");
        int index = scanner.nextInt();

        System.out.print("Enter a sentence: ");
        String sentence = scanner.next();

        System.out.println("\nYour sentence: " + sentence);
        System.out.println("Your index: " + index);
    }
}

Ainsi, pour lire une ligne d'entrée, vous avez seulement besoin de scanner.next() qui a le même comportement au niveau des délimiteurs que next{Int, Double, ...}.

La différence avec l'approche "nextLine() à chaque fois", est que cette dernière acceptera, comme index également <space>3 , 3<space> y 3<space>whatever tandis que le premier n'accepte que 3 sur une ligne à part

11voto

FAISAL Points 219

C'est parce que lorsque vous entrez un nombre puis appuyez sur Entrée, input.nextInt() ne consomme que le nombre, pas la "fin de ligne". Les types de données primitifs comme int, double, etc. ne consomment pas la "fin de ligne", donc la "fin de ligne" reste dans la mémoire tampon et lorsque la fin de ligne est atteinte, elle est effacée. input.next() s'exécute, il consomme la "fin de ligne" du tampon de la première entrée. C'est pourquoi, votre String sentence = scanner.next() ne consomme que la "fin de ligne" et n'attend pas la lecture du clavier.

Conseil : utiliser scanner.nextLine() au lieu de scanner.next() parce que scanner.next() ne lit pas les espaces blancs du clavier. (Tronquez la chaîne après avoir donné un espace au clavier, ne montrez que la chaîne avant l'espace).

9voto

Umair Points 1

N'essayez pas de scanner du texte avec nextLine() ; APRÈS avoir utilisé nextInt() avec le même scanner ! Cela ne fonctionne pas bien avec le scanner Java, et de nombreux développeurs Java choisissent d'utiliser simplement un autre scanner pour les entiers. Vous pouvez appeler ces scanners scan1 et scan2 si vous le souhaitez.

4voto

Alexandar Points 21

Ou

int selection = Integer.parseInt(scanner.nextLine());

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