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

时间:2015-09-30 19:24:31

标签: 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);

如果我输入

Hello World
12.1
12 

输出

String: Hello World
Double: 12.1
Int: 12

但是,如果我重新安排我的代码,请将其称为代码#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);

我输入

12
12.1

编译器跳过字符串输入和输出

String:
Double: 12.1
Int: 12 

这对我来说很奇怪。我被教导编译器总是从上到下阅读。我想编译器将代码#2视为

int x = keyboard.nextInt();

首先等待用户输入一个整数,以便将其分配给x。然后读

double y = keyboard.nextDouble();

等待用户输入double,以便将其分配给y。然后它最终读取

String s = keyboard.nextLine();

并等待用户输入字符串,以便将其分配给s。实际上,对我来说,这是编译器如何读取代码#1和输出所需的。这似乎是一个微妙的差异,重新排列变量,但那么为什么输出如此不同?

2 个答案:

答案 0 :(得分:4)

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

在第二种情况下,您读取了一个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.

作为附带问题,请注意"下一行"在输入中是" 12.1"的剩余部分。 " 12.1"被读了。问题" Scanner is skipping nextLine() after using next(), nextInt() or other nextFoo() methods"。

中有更详细的描述

答案 1 :(得分:1)

我快速写这篇文章,如果我有错误或不清楚,请对不起。请告诉我。

这里的问题是扫描仪,而不是编译器。扫描程序以您请求的方式读取它可以访问的文本。

当您使用nextLine()方法时,您要求扫描器从光标的当前位置读取到行的末尾,或者如果没有引用当前文本,则获取新的文本行。< / p>

  

从键盘获取新文本,因为当前没有文本   扫描仪对象。然后阅读从中收到的全文   键盘并将其作为String返回给调用者。全行以来   如果你打电话给,扫描仪假设你不再需要它了   新的下一个***()方法。

String s = keyboard.nextLine(); 
     

从键盘获取新文本,因为当前没有文本   扫描程序对象。然后读取可解析为int的第一个文本   从键盘收到的文本并将其作为int返回   呼叫者,召集者。问题是,这基本上是扫描仪看到的   当你输入文字&#34; 12.1 \ n&#34;。如你所知,&#34; \ n&#34;是一个符号   返回(如按Enter键进入新行)。这意味着你的   扫描仪的光标现在位于int之后的位置   进入但仍然有&#34; \ n&#34;阅读。

     

示例:&#34; 12.1 * \ n&#34; // *表示光标的位置

     

int num = keyboard.nextInt();

     

获取新文本[/ code]所以当我们现在   再次调用nextLine(),它将读取当前行的其余部分。不   需要用户的任何输入,因为扫描仪仍然有文本   阅读。

     

s = keyboard.nextLine();

对于初学者,只需在每个nextInt / Double / etc之后添加一个keyboard.nextLine()即可完成读取。我并不是说这是&#34;对&#34;做事的方式,但对初学者来说这是完美的。

String s = keyboard.nextLine();
int num = keyboard.nextInt();
//read to end of Scanner object's text to "reset" it
keyboard.nextLine();
//get text normally
s = keyboard.nextLine();