只有一个问题:为什么我必须两次输入answer = in.nextLine();
?如果此行为单行,则程序无法按预期工作。没有第二行,程序不会要求您输入字符串。
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String answer = "Yes";
while (answer.equals("Yes")) {
System.out.println("Enter name and rating:");
String name = in.nextLine();
int rating = 0;
if (in.hasNextInt()) {
rating = in.nextInt();
} else {
System.out.println("Error. Exit.");
return;
}
System.out.println("Name: " + name);
System.out.println("Rating: " + rating);
ECTS ects = new ECTS();
rating = ects.checkRating(rating);
System.out.println("Enter \"Yes\" to continue: ");
answer = in.nextLine();
answer = in.nextLine();
}
System.out.println("Bye!");
in.close();
}
}
答案 0 :(得分:3)
Scanner-Object有一个内部缓存。
nextInt()
。现在,内部缓存有3个字符,扫描器看到第三个字符( return )不是数字,因此nextInt()
只返回第1个和第2个整数字符( 1 , 2 = 12)。
nextInt()
返回12。不幸的是, return 仍然是Scanner缓存的一部分。
您调用nextLine()
,但方法会在其缓存中扫描newline
- 在nextInt()
调用返回之前保留在缓存中的标记。
nextLine()
返回0长度字符串。
nextLine()
有一个空缓存!它会等到缓存填满下一个newline
- 标记。有一种更优雅的方式来清除缓存而不是使用nextLine()
:
in.reset();
答案 1 :(得分:2)
因为你正在使用nextInt()这个方法只抓取下一个int,它不会消耗\ n字符,所以下次你执行nextLine()时它会完成消耗该行,然后移动到下一行。