web-dev-qa-db-fra.com

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 # 1: Cet exemple fonctionne comme prévu. La ligne String sentence = scanner.nextLine(); attend la saisie avant de passer à System.out.print("Enter an index:\t");.

Ceci 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 # 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 quoi faire. Une fois que le programme a atteint String sentence = scanner.nextLine();, il n'attend pas l'entrée mais exécute la ligne System.out.print("Enter an index:\t");.

Ceci 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 la saisie d'une phrase.


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

90
Taylor P.

Je pense que ton problème est que

int selection = scanner.nextInt();

lit seulement le nombre, pas la fin de la ligne ou quoi que ce soit après le nombre. Quand vous déclarez

String sentence = scanner.nextLine();

Ceci lit le reste de la ligne avec le numéro dessus (avec rien après le numéro que je soupçonne)

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

120
Peter Lawrey

Plutôt que de placer un scanner.nextLine() supplémentaire à chaque fois que vous voulez lire quelque chose, puisqu'il semble que vous souhaitiez accepter chaque entrée sur une nouvelle ligne, vous souhaiterez peut-être changer le délimiteur pour qu'il ne corresponde réellement qu'aux nouvelles lignes (au lieu des espaces blancs). , comme 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 que celui de délimiteur suivant {Int, Double, ...}

La différence avec l’approche "nextLine () Every Time", c’est que ce dernier accepte également comme index _<space>3_, _3<space>_ et _3<space>whatever_ alors que le premier n’accepte que _3_ sur une ligne seule

22
berdario

En effet, lorsque vous entrez un numéro puis appuyez sur Entrée, input.nextInt() ne consomme que le numéro, pas la "fin de ligne". Les types de données primitifs tels que int, double, etc. ne consomment pas "la fin de la ligne", la "fin de la ligne" reste donc dans le tampon et lorsque input.next() s'exécute, la "fin de la ligne" du tampon de la première entrée est utilisée. . C'est pourquoi votre String sentence = scanner.next() ne consomme que la "fin de ligne" et n'attend pas de lire à partir du clavier.

Astuce: utilisez 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 laissé de l'espace sur le clavier, affichez uniquement la chaîne avant l'espace.)

10
FAISAL

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

9
Umair

ou

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