我有下面的代码叫它代码#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和输出所需的。这似乎是一个微妙的差异,重新排列变量,但那么为什么输出如此不同?
答案 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();