我有以下代码,称之为代码#1
Scanner keyboard = new Scanner(System.in);
String s = keyboard.nextLine();
int x = keyboard.nextInt();
double y = keyboard.nextDouble();
System.out.println("String: "+s);
System.out.println("Double: "+y);
System.out.println("Int: "+x);
Run Code Online (Sandbox Code Playgroud)
如果我输入
Hello World
12.1
12
Run Code Online (Sandbox Code Playgroud)
输出将是
String: Hello World
Double: 12.1
Int: 12
Run Code Online (Sandbox Code Playgroud)
但是,如果我重新排列我的代码,请将其称为 code#2,如
Scanner keyboard = new Scanner(System.in);
int x = keyboard.nextInt();
double y = keyboard.nextDouble();
String s = keyboard.nextLine();
System.out.println("String: "+s);
System.out.println("Double: "+y);
System.out.println("Int: "+x);
Run Code Online (Sandbox Code Playgroud)
我输入
12
12.1
Run Code Online (Sandbox Code Playgroud)
编译器跳过字符串输入和输出
String:
Double: 12.1
Int: 12
Run Code Online (Sandbox Code Playgroud)
这对我来说很奇怪。我被告知编译器总是从上到下阅读。我想象编译器将 code#2 读取为
int x = keyboard.nextInt();
Run Code Online (Sandbox Code Playgroud)
首先等待用户输入一个整数,以便将其分配给 x。然后读
double y = keyboard.nextDouble();
Run Code Online (Sandbox Code Playgroud)
等待用户输入双精度值,以便将其分配给 y。最后它读到
String s = keyboard.nextLine();
Run Code Online (Sandbox Code Playgroud)
并等待用户输入字符串,以便将其分配给 s。事实上,对我来说,这就是编译器读取代码#1 和输出的方式。重新排列变量,这似乎是一个微妙的差异,但为什么输出如此不同呢?
这不是编译器。而且这不是变量声明的顺序。这是您从输入流中读取的顺序。
在第二种情况下,您读取一个 int、一个 double 和一行。这正是它的作用。
int x = keyboard.nextInt(); // Reads "12"
double y = keyboard.nextDouble(); // Reads "12.1"
String s = keyboard.nextLine(); // Reads the remainder of the "12.1" line.
Run Code Online (Sandbox Code Playgroud)
作为一个附带问题,请注意输入中的“下一行”是读取“12.1”后“12.1”行的剩余部分。问题“扫描仪在使用 next()、nextInt() 或其他 nextFoo() 方法后跳过 nextLine() ”对此进行了更详细的描述。