下面是两个脚本,它们只是要求用户输入的顺序不同。脚本#1可以工作,而脚本#2不能像预期的那样工作。在脚本#1中,我先问name
问题,然后问age
问题。在脚本#2中,我先问age
问题,然后问name
问题。
脚本#1 (works):
import java.util.Scanner;
public class Example2 {
public static void main(String[] args) {
// Initiate a new Scanner
Scanner userInputScanner = new Scanner(System.in);
// Name Question
System.out.print("nWhat is your name? ");
String name = userInputScanner.nextLine();
// Age Question
System.out.print("How old are you?");
int age = userInputScanner.nextInt();
System.out.println("nHello " + name + ". You are " + age
+ " years old");
}
}
脚本#2(不工作):
import java.util.Scanner;
public class Example2 {
public static void main(String[] args) {
// Initiate a new Scanner
Scanner userInputScanner = new Scanner(System.in);
// Age Question
System.out.print("How old are you?");
int age = userInputScanner.nextInt();
// Name Question
System.out.print("nWhat is your name? ");
String name = userInputScanner.nextLine();
System.out.println("nHello " + name + ". You are " + age
+ " years old");
}
}
在脚本#2中,用户输入age
后,他/她得到以下打印到控制台:
What is your name?
Hello . You are 28 years old
然后脚本结束,不允许他/她输入name
我的问题:为什么脚本#2不起作用?我该怎么做才能让脚本#2工作(同时保持输入的顺序)
您必须在读取年龄后消耗EOL(行尾):
System.out.print("How old are you?");
int age = userInputScanner.nextInt();
userInputScanner.nextLine();
// Name Question
System.out.print("nWhat is your name? ");
String name = userInputScanner.nextLine();
如果你不这样做,EOL符号将在String name = userInputScanner.nextLine();
处被消耗,这就是为什么你不能输入它。
当你读取一行时,它会读取整行直到末尾。
当你读取一个数字时,它只读取数字,它不读取行尾,例如,除非你再次调用nextInt()
,在这种情况下,它将把新行作为空白读取。
简而言之,如果您希望输入忽略数字之后的任何内容,则写入
int age = userInputScanner.nextInt();
userInputScanner.nextLine(); // ignore the rest of the line.
在您的情况下,如果您没有输入任何内容,您的nextLine()
将读取数字或空字符串后面的文本。
nextInt()
方法将不使用来自输入流的回车。你需要自己消耗它。
import java.util.Scanner;
public class Example2 {
public static void main(String[] args) {
// Initiate a new Scanner
Scanner userInputScanner = new Scanner(System.in);
// Age Question
System.out.print("How old are you?");
int age = userInputScanner.nextInt();
// consume carriage return
userInputScanner.nextLine();
// Name Question
System.out.print("nWhat is your name? ");
String name = userInputScanner.nextLine();
System.out.println("nHello " + name + ". You are " + age
+ " years old");
}
}
如果用户输入一个数字(比如21),实际输入是:"21n"。
您需要跳过"n",并额外调用nextLine:
// Age Question
System.out.print("How old are you?");
int age = userInputScanner.nextInt();
userInputScanner.nextLine(); // skip "n"