java - Usando scanner.nextLine()
java.util.scanner (5)
Esta pregunta ya tiene una respuesta aquí:
He estado teniendo problemas al intentar utilizar el método nextLine () de java.util.Scanner.
Esto es lo que intenté:
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 a 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 como se esperaba. Este ejemplo utiliza un ciclo 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 n. ° 2 no funciona como se esperaba? La única diferencia entre Ex. 1 y 2 es que Ex. 2 tiene un ciclo while y una estructura if-else. No entiendo por qué esto afecta el comportamiento de scanner.nextInt ().
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 (sin nada después del número que sospecho)
Intente ubicar un scanner.nextLine (); después de cada nextInt () si tiene la intención de ignorar el resto de la línea.
En lugar de colocar un scanner.nextLine()
adicional cada vez que desee leer algo, ya que parece que desea aceptar cada entrada en una nueva línea, puede cambiar el delimitador en lugar de solo hacer coincidir las nuevas líneas (en lugar de cualquier espacio en blanco) , como es el 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 delimitador-wise 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
que 3<space>whatever
mientras que el primero solo acepta 3
en una línea en su propio
Es porque cuando ingresa un número, presione 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 "final de línea" permanece en el búfer y cuando se ejecuta input.next()
, consume el "final de línea" del búfer de la primera entrada . Es por eso que la String sentence = scanner.next()
solo consume el "final de la línea" y no espera para leer desde el teclado.
Consejo: utilice scanner.nextLine()
lugar de scanner.next()
porque scanner.next()
no lee espacios en blanco del teclado. (Truncar la cadena después de dar algo de espacio desde el teclado, solo mostrar 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 simplemente usar otro escáner para enteros. Puede llamar a estos escáneres scan1 y scan2 si lo desea.
o
int selection = Integer.parseInt(scanner.nextLine());