2011-10-24 21 views
17

Estoy escribiendo un programa simple que solicita que un usuario ingrese un número de estudiantes, luego le pide al usuario que ingrese el nombre y puntaje de cada estudiante para determinar qué estudiante tiene el puntaje más alto.La entrada de Java String Scanner no espera la información, se mueve directamente a la siguiente instrucción. ¿Cómo esperar información?

He escrito el código del programa y compila. La primera línea pide un número de estudiantes y espera la entrada. Se supone que la segunda línea debe pedir el nombre de un estudiante y esperar la entrada, luego debe imprimir una tercera línea y preguntar el puntaje de ese estudiante, y esperar la entrada, pero después de que se imprime la segunda línea, se llama inmediatamente a la tercera línea. no espere la entrada) y luego obtengo un error de tiempo de ejecución al tratar de ingresar la información solicitada después de la tercera línea.

¿Cómo ajusto el código para que se imprima la segunda línea y espere a que se ingrese una cadena antes de imprimir la tercera línea?

import java.util.Scanner; 

public class HighestScore { 
    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 

     System.out.print("Enter the number of students: "); 
     int numOfStudents = input.nextInt(); 

     System.out.print("Enter a student's name: "); 
     String student1 = input.nextLine(); 

     System.out.print("Enter that student's score: "); 
     int score1 = input.nextInt(); 

     for (int i = 0; i <= numOfStudents - 1; i++) { 

      System.out.println("Enter a student's name: "); 
      String student = input.nextLine(); 

      System.out.println("Enter that student's score: "); 
      int score = input.nextInt(); 

      if (score > score1) { 
      student1 = student; 
      score1 = score; 
      } 
     } 
     System.out.println("Top student " + 
     student1 + "'s score is " + score1); 
    } 
} 

Respuesta

14
System.out.print("Enter the number of students: "); 
    int numOfStudents = input.nextInt(); 
    // Eat the new line 
    input.nextLine(); 
    System.out.print("Enter a student's name: "); 
    String student1 = input.nextLine(); 
+0

Brilliant! ¡Funciona! ¡Gracias! – user1011064

36

Es por eso que No no le gustó el uso de un Scanner, a causa de este comportamiento. (Una vez que entendí lo que estaba sucediendo y me sentí cómodo con él, me gustó mucho Scanner).

Lo que está sucediendo es que la llamada al nextLine() primero termina la línea donde el usuario ingresa el número de estudiantes. ¿Por qué? Porque nextInt() lee solo una int y no termina la línea.

Así que agregar una declaración extra readLine() resolvería este problema.

System.out.print("Enter the number of students: "); 
int numOfStudents = input.nextInt(); 

// Skip the newline 
input.nextLine(); 

System.out.print("Enter a student's name: "); 
String student1 = input.nextLine(); 

Como ya he dicho, no me gustó el uso del escáner. Lo que solía hacer era usar un BufferedReader. Es más trabajo, pero es un poco más sencillo lo que realmente está sucediendo. Su aplicación se vería así:

BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); 

System.out.println("Enter the number of students: "); 
int numOfStudents = Integer.parseInt(input.readLine()); 

String topStudent = null; 
int topScore = 0; 
for (int i = 0; i < numOfStudents; ++i) 
{ 
    System.out.print("Enter the name of student " + (i + 1) + ": "); 
    String student = input.nextLine(); 

    // Check if this student did better than the previous top student 
    if (score > topScore) 
    { 
     topScore = score; 
     topStudent = student; 
    } 
} 
1

Vaya que se parece a un mal diseño - si pide un número entero de un d hacer un nextInteger() del escáner le dará el número entero, pero ahora se está llevando a cabo una nueva línea carácter en su memoria intermedia ya que el usuario tiene que presionar enter para enviar el entero, por lo que si luego desea solicitar una cadena al usuario, no esperará la entrada y solo le devolverá un nuevo carácter de línea. No puede borrar el escáner para evitar este tipo de problema ...

¿Qué me falta?

Adam

Cuestiones relacionadas