L’input di Java String Scanner non attende informazioni, passa direttamente all’istruzione successiva. Come aspettare per informazioni?

Sto scrivendo un semplice programma che richiede a un utente di inserire un numero di studenti, quindi chiede all’utente di inserire il nome e il punteggio di ogni studente al fine di determinare quale studente ha il punteggio più alto.

Ho scritto il codice del programma e lo compila. La prima riga richiede un numero di studenti e attende l’input. La seconda riga dovrebbe chiedere il nome di uno studente e attendere l’input, quindi una terza riga dovrebbe stampare e chiedere il punteggio di quello studente, e attendere l’input ma dopo che la seconda riga viene stampata, la terza riga viene immediatamente chiamata (la seconda riga non attendere l’input) e quindi ottengo un errore di runtime quando provo a inserire le informazioni richieste dopo la terza riga.

Come aggiusto il codice in modo che la seconda riga stampi e aspetti che una stringa venga inserita prima di stampare la terza riga?

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  score1) { student1 = student; score1 = score; } } System.out.println("Top student " + student1 + "'s score is " + score1); } } 

Questo è perché io non non mi piace usare uno Scanner , a causa di questo comportamento. (Una volta capito cosa stava succedendo e mi sono sentito a mio agio, mi piace molto Scanner).

Quello che sta accadendo è che la chiamata a nextLine() prima finisce la linea in cui l’utente inserisce il numero di studenti. Perché? Perché nextInt() legge solo un int e non finisce la linea.

Quindi aggiungere una ulteriore istruzione readLine() risolverebbe questo 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(); 

Come ho già detto, non mi piaceva usare Scanner. Quello che facevo era usare un BufferedReader. È più lavoro, ma è leggermente più semplice ciò che sta realmente accadendo. La tua applicazione sarà simile a questa:

 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; } } 
  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(); 

Wow sembra un pessimo design – se chiedi un intero e un nextInteger () lo scanner ti darà il numero intero, ma ora tiene un nuovo carattere di linea nel suo buffer mentre l’utente deve premere invio per inviare il intero, quindi se in un secondo momento si desidera richiedere all’utente una stringa, non attenderà l’input e ti restituirà un nuovo carattere di linea. Non puoi cancellare lo scanner per evitare questo tipo di problema …

Cosa mi manca?

Adamo