我正在编写一个简单的程序,提示用户输入一些学生,然后要求用户输入每个学生的姓名和分数,以确定哪个学生得分最高。
我编写了程序代码并编译。第一行要求一些学生并等待输入。第二行应该是要求学生姓名并等待输入,然后第三行应该打印ans询问该学生的分数,并等待输入但是在第二行打印后,立即调用第三行(第二行是不等待输入)然后在尝试在第三行之后输入所请求的信息时出现运行时错误。
如何调整代码以便在打印第三行之前打印第二行并等待输入字符串?
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);
}
}
答案 0 :(得分:45)
这就是为什么我不不喜欢使用Scanner
,因为这种行为。 (一旦我理解了发生的事情,并对此感到满意,我非常喜欢Scanner。)
发生的事情是,nextLine()
的呼叫首先完成用户输入学生人数的行。为什么?因为nextInt()
只读取一个int并且没有完成该行。
因此,添加额外的readLine()
语句可以解决此问题。
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();
正如我已经提到的,我不喜欢使用Scanner。我以前做的是使用BufferedReader。这是更多的工作,但实际发生的事情稍微简单一些。您的应用程序如下所示:
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 :(得分:15)
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();
答案 2 :(得分:3)
哇看起来很糟糕的设计 - 如果你要求一个整数并且d执行nextInteger(),扫描器会给你一个整数,但它现在在其缓冲区中持有一个新的行字符,因为用户必须按Enter键提交整数,所以如果你以后想要提示用户输入一个字符串,它将不会等待输入,只是给你一个换行符。 您无法清除扫描仪以避免此类问题......
我错过了什么?
亚当