Usando scanner.nextLine() [duplicado]

Resuelto Taylor P. asked hace 13 años • 5 respuestas

He tenido problemas al intentar utilizar el método nextLine() de java.util.Scanner.

Esto es lo que probé:

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);
    }
}

Ejemplo n.º 1: este ejemplo funciona según lo previsto. La línea String sentence = scanner.nextLine();espera que se ingrese la entrada antes de continuar con System.out.print("Enter an index:\t");.

Esto produce la salida:

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;
            }
        }
    }
}

Ejemplo n.º 2: este ejemplo no funciona según lo previsto. Este ejemplo utiliza un bucle while y una estructura if - else para permitir al usuario elegir qué hacer. Una vez que el programa llega a String sentence = scanner.nextLine();, no espera la entrada sino que ejecuta la línea System.out.print("Enter an index:\t");.

Esto produce la salida:

Menu Options

(1) - do this
(2) - quit

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

Lo que hace imposible introducir una frase.


¿Por qué el ejemplo n.° 2 no funciona según lo previsto? La única diferencia entre Éx. 1 y 2 es que Éx. 2 tiene un bucle while y una estructura if-else. No entiendo por qué esto afecta el comportamiento de scanner.nextInt().

Taylor P. avatar Feb 18 '11 00:02 Taylor P.
Aceptado

Creo que tu problema es que

int selection = scanner.nextInt();

lee solo el número, no el final de la línea ni nada después del número. cuando declaras

String sentence = scanner.nextLine();

Esto lee el resto de la línea con el número (sospecho que sin nada después del número)

Intente colocar un scanner.nextLine(); después de cada nextInt() si desea ignorar el resto de la línea.

Peter Lawrey avatar Feb 17 '2011 17:02 Peter Lawrey

En lugar de colocar un extra scanner.nextLine()cada vez que desee leer algo, ya que parece que desea aceptar cada entrada en una nueva línea, es posible que desee cambiar el delimitador para que coincida solo con nuevas líneas (en lugar de cualquier espacio en blanco, como es el valor predeterminado). )

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);
    }
}

Por lo tanto, para leer una línea de entrada, solo necesita scanner.next()que tenga el mismo comportamiento en cuanto a delimitadores de next{Int, Double, ...}

La diferencia con el enfoque "nextLine() cada vez" es que este último aceptará, también como índice <space>3, 3<space>y 3<space>whatevermientras que el primero solo aceptará 3en una línea propia.

berdario avatar Jun 13 '2013 10:06 berdario

Es porque cuando ingresa un número y luego presiona Enter, input.nextInt()consume solo el número, no el "final de línea". Los tipos de datos primitivos como int, double, etc. no consumen el "fin de línea", por lo tanto, el "fin de línea" permanece en el búfer y, cuando input.next()se ejecuta, consume el "fin de línea" del búfer desde la primera entrada. Por eso, String sentence = scanner.next()solo consume el "final de línea" y no espera a leer desde el teclado.

Consejo: utilícelo scanner.nextLine()en lugar de scanner.next()porque scanner.next()no lee los espacios en blanco del teclado. (Trunque la cadena después de dar algo de espacio desde el teclado, solo muestre la cadena antes del espacio).

FAISAL avatar Jul 17 '2013 09:07 FAISAL

No intente escanear texto con nextLine(); ¡DESPUÉS de usar nextInt() con el mismo escáner! No funciona bien con Java Scanner y muchos desarrolladores de Java optan por utilizar otro escáner para números enteros. Puede llamar a estos escáneres scan1 y scan2 si lo desea.

Umair avatar Sep 17 '2013 09:09 Umair

o

int selection = Integer.parseInt(scanner.nextLine());
Alexandar avatar Jul 13 '2013 06:07 Alexandar