Usando escáner.nextLine() [duplicate]

4 minutos de lectura

Usando escanernextLine duplicate
taylor p.

He tenido problemas al intentar usar 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 1: Este ejemplo funciona según lo previsto. La línea String sentence = scanner.nextLine(); espera a que se introduzca 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 #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 que sea imposible ingresar una oración.


¿Por qué el ejemplo #2 no funciona según lo previsto? La única diferencia entre Ej. 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().

  • Relacionado: stackoverflow.com/questions/4708219/…

    – James P.

    17 de febrero de 2011 a las 17:36

  • en el ejemplo # 2, antes de esta línea String sentencia = scanner.nextLine(); agregue debajo de la línea sc.nextLine();

    – Bravo

    1 de mayo de 2016 a las 4:28

Usando escanernextLine duplicate
pedro laurey

creo que tu problema es ese

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 (sin nada después del número que sospecho)

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

  • Esto es correcto. El retorno de carro no es consumido por nextInt. La solución alternativa es usar su solución o usar un patrón para incluir CR y otros delimitadores.

    – James P.

    17 de febrero de 2011 a las 17:34


En lugar de colocar un extra scanner.nextLine() cada vez que quiera leer algo, ya que parece que quiere aceptar cada entrada en una nueva línea, es posible que desee cambiar el delimitador para que coincida solo con las 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 tiene el mismo comportamiento en cuanto al delimitador de next{Int, Double, …}

La diferencia con el enfoque “nextLine() cada vez”, es que este último aceptará, como un índice también <space>3, 3<space> y 3<space>whatever mientras que el primero solo acepta 3 en una línea por su cuenta

Usando escanernextLine duplicate
FAISAL

Es porque cuando ingresas un número y luego presionas Enter, input.nextInt() consume solo el número, no el “fin de línea”. Los tipos de datos primitivos como int, double, etc. no consumen “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 de la primera entrada. Por eso, tu String sentence = scanner.next() solo consume el “fin de línea” y no espera para leer desde el teclado.

Propina: utilizar 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).

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 usar otro Scanner para números enteros. Puede llamar a estos escáneres scan1 y scan2 si lo desea.

1646746569 245 Usando escanernextLine duplicate
Alejandro

o

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad