为什么重新排列变量后输出不同?

Die*_*nut 2 java

我有以下代码,称之为代码#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 和输出的方式。重新排列变量,这似乎是一个微妙的差异,但为什么输出如此不同呢?

And*_*mas 5

这不是编译器。而且这不是变量声明的顺序。这是您从输入流中读取的顺序。

在第二种情况下,您读取一个 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() ”对此进行了更详细的描述。