Obtener la entrada del usuario con el escáner

Estoy tratando de tener un escáner tomar entrada en un bucle. Una vez que el usuario quiere terminar, puede salir de este ciclo. He intentado muchas formas diferentes de hacerlo, pero siempre hay algún problema. Este es el código:

private void inputEntries() { Scanner sc = new Scanner(System.in); System.out.println("Continue?[Y/N]"); while (sc.hasNext() && (sc.nextLine().equalsIgnoreCase("y"))) {//change here System.out.println("Enter first name"); String name = sc.nextLine(); System.out.println("Enter surname"); String surname = sc.nextLine(); System.out.println("Enter number"); int number = sc.nextInt(); Student student = new Student(name, surname, number); students.add(student); try { addToFile(student); } catch (Exception ex) { Logger.getLogger(TextReader.class.getName()).log(Level.SEVERE, null, ex); } System.out.println("Continue?[Y/N]"); } } 

El problema con el código anterior, que también ocurre en diferentes métodos que probé, es que cuando el usuario escribe Y , el Scanner salteará la primera entrada para el primer nombre, y saltará al apellido. Si el usuario escribe N, el ciclo se detiene correctamente. ¿Alguien puede explicar el motivo por el que sucede esto y cómo superar el uso de la clase de Scanner ?

ps: Hacer algo como while(sc.nextLine().equals("Y")) hará que el ciclo termine antes de recibir la entrada del usuario después de la primera ejecución del ciclo.

Esto se debe a que está utilizando Scanner#next método de Scanner#next . Y si nos fijamos en la documentación de ese método, devuelve la siguiente lectura del token.

Por lo tanto, cuando lee la entrada del usuario utilizando el next método, no lee la newline al final. Que luego es leído por nextLine() dentro del ciclo while. Y por lo tanto, su firstName contiene una newline sin que usted lo sepa.

Por lo tanto, debe usar nextLine() en su tiempo en lugar de en next() .

Similar es el caso con el método nextInt . Tampoco lee la nueva línea. Entonces, puede read usando readLine y convertirlo a int usando Integer.parseInt . Puede lanzar NumberFormatException si el valor de entrada no se puede convertir a int . Entonces debes manejarlo en consecuencia.

Puedes probar el siguiente código:

 Scanner sc = new Scanner(System.in); System.out.println("Continue?[Y/N]"); while (sc.hasNext() && (sc.nextLine().equalsIgnoreCase("y"))) {//change here System.out.println("Enter first name"); String name = sc.nextLine(); System.out.println("Enter surname"); String surname = sc.nextLine(); System.out.println("Enter number"); int number = 0; try { number = Integer.parseInt(sc.nextLine()); } catch (IllegalArgumentException e) { e.printStackTrace(); } System.out.println("Continue?[Y/N]"); } 

Pero, tenga en cuenta una cosa, si ingresa un valor que no se puede pasar a Integer.parseInt obtendrá una excepción, y esa entrada se omitirá. Para ese caso, debe manejarlo utilizando while loop.

O bien, si no desea hacer el manejo de excepciones : –

Puede agregar un empty sc.nextLine() después de sc.nextInt() , que consumirá la newline sobrante, como esta: –

  // Left over part of your while loop String surname = sc.nextLine(); System.out.println("Enter number"); int number = sc.nextInt(); sc.nextLine(); // To consume the left over newline; System.out.println("Continue?[Y/N]"); 
  • Use equalsIgnoreCase(..) para evitar que el caso de Y o N sea ​​minúscula y viceversa.
  • No use sc.next() lugar de sc.nextLine() para lograr lo que quiere, porque next() solo lee hasta el siguiente espacio mientras nextLine() lee hasta el siguiente \n break.
  • No use nextInt() lea todos los datos como String y luego convierta porque nextInt() es como next() tanto, no se lee hasta el siguiente \ n .

Pruébalo así:

 Scanner sc = new Scanner(System.in); System.out.println("Continue?[Y/N]"); while (sc.hasNext() && (sc.nextLine().equalsIgnoreCase("y"))) {//change here System.out.println("Enter first name"); String name = sc.nextLine(); System.out.println("Enter surname"); String surname = sc.nextLine(); System.out.println("Enter number"); int number=0; try { number = Integer.parseInt(sc.nextLine());//read int as string using nextLine() and parse }catch(NumberFormatException nfe) { nfe.printStackTrace(); } System.out.println("Continue?[Y/N]"); } 

Podrías usar

 String abc = "abc"; String answer = "null"; while (abc.equals("abc") { if (answer.equals("n") { break; } while (answer.equals("y")) { //Put your other code here System.out.print("Continue? [y/n]") answer = input.nextLine(); if (answer.equals("n") { break; } } } 

Eso debería detener el progtwig cuando la entrada es

 "n" 

También tendrá que importar y crear el escáner de esta manera:

 //This is how you import the Scanner import java.util.Scanner; //This is how you create the Scanner Scanner input = new Scanner(System.in); /** *The name */ "input" /** *is used because of */ input.nextLine 
 public void display() { int i, j; for (i = 1; i < = 5; i++) { for (j = i; j < 5; j++) { System.out.print(" "); } for (j = 1; j < (2 * i); j++) { System.out.print(i % 2); } for (j = 1; j < ((5 * 2) - (i * 2)); j++) { System.out.print(" "); } for (j = 1; j < (2 * i); j++) { System.out.print(j); } System.out.println(); } for (i = 4; i >= 1; i--) { for (j = i; j < 5; j++) { System.out.print(" "); } for (j = 1; j <= i; j++) { System.out.print(j); } for (j = i - 1; j >= 1; j--) { System.out.print(j); } for (j = 1; j < ((5 * 2) - (i * 2)); j++) { System.out.print(" "); } for (j = 1; j < (2 * i); j++) { System.out.print(j); } System.out.println(); } }