Java 为什么扫描仪是这样工作的?

Java 为什么扫描仪是这样工作的?,java,java.util.scanner,Java,Java.util.scanner,我只是好奇: 假设我设置了一个扫描仪 Scanner sc = new Scanner (System.in) int number = sc.nextInt(); String name = sc.nextLine(); System.out.println (number); System.out.println (name); 会发生的情况是,我甚至无法输入姓名,而打印出来的只是号码。相反,如果我要做: Scanner sc = new Scanner (System.in) int

我只是好奇:

假设我设置了一个扫描仪

Scanner sc = new Scanner (System.in)
int number = sc.nextInt();
String name = sc.nextLine(); 
System.out.println (number);
System.out.println (name);
会发生的情况是,我甚至无法输入姓名,而打印出来的只是号码。相反,如果我要做:

Scanner sc = new Scanner (System.in)
int number = sc.nextInt();
String name = sc.next(); 
System.out.println (number);
System.out.println (name);
然后一切都很顺利,但是不能在字符串中使用空格

为什么被扫描的字符串在后面跟一个数字后表现得如此有趣。如果我只使用两个字符串,它就不会像它看起来那样做

我知道解决方法是在两行之间放一个空行,但我只想知道为什么会发生这种情况。

sc.nextLine()
读取当前行,直到它遇到行尾字符。如果在调用读取部分行的Scanner方法(
nextInt()
next()
,等等)后调用
sc.nextLine()
,它将返回当前行的结尾(如果当前行剩下的都是新行字符,则该结尾可能为空)

因此,从部分行读取输入后,如果要读取下一行输入,必须首先调用
sc.nextLine()
移动到当前行,然后才将
sc.nextLine()
分配给变量以获取下一行的内容。

sc.nextLine()
读取当前行,直到遇到行尾字符。如果在调用读取部分行的Scanner方法(
nextInt()
next()
,等等)后调用
sc.nextLine()
,它将返回当前行的结尾(如果当前行剩下的都是新行字符,则该结尾可能为空)


因此,在从部分行读取输入后,如果要读取下一行输入,必须首先调用
sc.nextLine()
移动当前行,然后才将
sc.nextLine()
分配给变量以获取下一行的内容。

我完全同意@Eran的回答,我只是想指出,通常这种信息就在javadoc中,您只需要阅读它

对于
nextInt()

正如你所看到的,它没有说要跳到下一行,而是停留在同一行

对于
nextLine()


因此,在调用
nextLine()
之后,您仍然在同一行,如果没有其他内容,那么
nextLine()
将不打印任何内容并跳转到下一行。

我完全同意@Eran的回答,只是想指出,通常这种信息就在javadoc中,您只需要阅读它

对于
nextInt()

正如你所看到的,它没有说要跳到下一行,而是停留在同一行

对于
nextLine()


因此,在调用
nextLine()
之后,您仍然在同一行,如果没有其他内容,那么
nextLine()
将不打印任何内容并跳到下一行。

您是否将“空格”与“新行”字符混淆?您的混淆可能是与
next()
nextLine()
?不,我没有。如果我想使用第二个示例编写字符串“This blows”,那么打印出来的所有内容都是这样的。这是因为next()函数使用的是正则表达式模式。Scanner是基于正则表达式的标记化器,所以nextLine()是查找下一个“\n”,并将当前点之后到下一个“\n”出现点的所有内容视为标记并将其作为字符串返回,而next()则从该扫描程序中查找并返回下一个完整标记并将其作为字符串返回;标记通常以空白或换行符等空格结尾。因此字符串之间不能有空格。检查这些链接您是否混淆了“空格”和“新行”字符?您可能混淆了
next()
nextLine()
?不,我没有。如果我想使用第二个示例编写字符串“This blows”,那么打印出来的所有内容都是这样的。这是因为next()函数使用的是正则表达式模式。Scanner是基于正则表达式的标记化器,所以nextLine()是查找下一个“\n”,并将当前点之后到下一个“\n”出现点的所有内容视为标记并将其作为字符串返回,而next()则从该扫描程序中查找并返回下一个完整标记并将其作为字符串返回;标记通常以空白或换行符等空格结尾。因此字符串之间不能有空格。检查我看到的这些链接!有趣。谢谢你的澄清。我只是好奇,我知道如何解决它,但不知道为什么我必须这么做。我明白了!有趣。谢谢你的澄清。我只是好奇,我知道如何解决它,但不知道为什么我必须这么做。
* Scans the next token of the input as an <tt>int</tt>.
* This method will throw <code>InputMismatchException</code>
* if the next token cannot be translated into a valid int value as
* described below. If the translation is successful, the scanner advances
* past the input that matched.
* Advances this scanner past the current line and returns the input
* that was skipped.
*
* This method returns the rest of the current line, excluding any line
* separator at the end. The position is set to the beginning of the next
* line.