He tenido problemas al intentar utilizar el método nextLine() de java.util.Scanner.
Esto es lo que he intentado:
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 como se pretende. La línea String sentence = scanner.nextLine();
espera a que se introduzca la entrada antes de continuar con System.out.print("Introduzca un índice:\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 como se pretende. 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("Introduzca un índice:\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 2 no funciona como se pretende? La única diferencia entre el Ej. 1 y el 2 es que el Ej. 2 tiene un bucle while y una estructura if-else. No entiendo por qué esto afecta al comportamiento de scanner.nextInt().
Creo que su problema es que
int selection = scanner.nextInt();
lee sólo el número, no el final de 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 en ella (con nada después del número sospecho)
Intenta colocar un scanner.nextLine(); después de cada nextInt() si pretendes ignorar el resto de la línea.
En lugar de colocar un scanner.nextLine()
extra cada vez que quieras leer algo, ya que parece que quieres aceptar cada entrada en una nueva línea, podrías cambiar el delimitador para que sólo coincida con las nuevas líneas (en lugar de cualquier espacio en blanco, como es el valor por defecto)
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);
}
}
Así, para leer una línea de entrada, sólo necesitas scanner.next()
que tiene el mismo comportamiento de delimitador que next{Int, Double, ...}
La diferencia con la aproximación de "nextLine() every time", es que esta última aceptará, como índice también <space>3
, 3<space>
y 3<space>lo que sea
mientras que la primera sólo acepta 3
en una línea por sí sola