Java 为什么多个nextInt()可以工作?
在下面的Java代码中Java 为什么多个nextInt()可以工作?,java,Java,在下面的Java代码中 Scanner input = new Scanner(System.in); //Cmd1 int i1,i2; //Cmd2 i1 = input.nextInt(); //Cmd3 System.out.println("value of i1 is "+ i1); //Cmd4 i2 = input.nextInt();
Scanner input = new Scanner(System.in); //Cmd1
int i1,i2; //Cmd2
i1 = input.nextInt(); //Cmd3
System.out.println("value of i1 is "+ i1); //Cmd4
i2 = input.nextInt(); //Cmd5
System.out.println("value of i2 is "+ i2); //Cmd6
String s1; //Cmd7
input.nextLine(); //Cmd8
s1 = input.nextLine(); //Cmd9
System.out.println("value of s1 is "+ s1); //Cmd10
我在控制台中获得了以下输出
<myinput> 1
<output> value of i1 is 1
<myinput> 2
<output> value of i2 is 2
<myinput> firstString
<output> value of s1 is firstString
1
i1的值为1
2.
i2的值为2
第一串
s1的值是第一个字符串
一直等待输入,直到我按下enter
键。我尝试了选项卡
,多个选项卡
,空格
,但它一直在等待,没有移动到下一个命令,因此我假设nextInt在移动到下一个命令之前会一直等待,直到在输入流中找到它
从中查看答案,我们必须添加
Cmd8
的原因是,nextInt()继续读取输入,直到\n
,将输入发送到程序,并将\n
放回输入流的前面。现在,当“Cmd8”中的nextLine()开始读取它时,它在输入流的开始处发现\n
没有任何前面的字符串,它假定用户没有输入任何内容,因此将空字符串作为输入并转到Cmd9
我的疑问是,nextInt()也会读取到
\n
(根据我的经验,这意味着Cmd3
会一直等待,直到我按下enter
)为什么Cmd5
会等待我的输入。它还应该在输入流的开头找到\n
,并假设我没有输入任何内容,并将空整数作为输入(类似于Cmd8
的行为)。这里发生了什么?我已经通过调试JRE Scanner类方法分析了您的问题。调用nextInt
函数时,扫描仪会查看当前缓冲区。如果没有可用的输入,则开始收听键盘,直到您按下Enter
键,整个键盘字符追加到缓冲区,并尝试匹配它是否为整数。当找到一个整数nextInt
时,返回该值并递增缓冲区的位置索引。下一步,您再次调用了nextInt
,只有\n
字符,然后它被丢弃并等待下一个整数模式。此外,缓冲区的下一个字符也是\n
。调用nextLine
时,它会查看缓冲区并打印空行。所以第二个nextLine
是以空文本开始的
也许这会让人困惑。让我们看一下场景:
注意:索引^
表示缓冲区的读取位置
i1=input.nextInt();
返回12
,下一个缓冲区位置位于\n
i2=input.nextInt();
返回34
,下一个缓冲区位置位于第二个\n
input.nextLine();
缓冲区有\n
字符,所以扫描仪不会等待键盘并返回值
buffer = | 1 | 2 | \n | 3 | 4 | \n |
index = ^
返回空文本
s1=input.nextLine();
返回test
注意以下文件摘录: 查找并返回此扫描程序中的下一个完整令牌。A. 完整标记的前面和后面是与 分隔符模式
Scanner
使用的默认分隔符是\p{javaWhitespace}+
,您可以通过以下方式获得:
import java.util.Scanner;
public class Main {
public static void main(String... args) {
Scanner input = new Scanner(System.in);
System.out.println(input.delimiter());
}
}
以下代码行显示了在找到10
或hello
时如何找到完整的令牌,即无论按Enter键多少次,next()
,nextInt()
等将一直请求输入,直到输入非空白字符注意:如果是nextInt()
,则值10
可解析为int
,但hello
不可解析,因此将抛出输入不匹配异常
public class Main {
public static void main(String... args) {
System.out.println(Character.isWhitespace('\n'));
System.out.println("\n\n\n\n\n".split("\\p{javaWhitespace}+").length);
System.out.println("10\n".split("\\p{javaWhitespace}+").length);
System.out.println("hello\n".split("\\p{javaWhitespace}+").length);
}
}
输出:
true
0
1
1
这适用于所有nextXXX()
,除了nextLine()
,其(下面给出的摘录)非常清楚其行为与其他nextXXX()
不同
使扫描器前进超过当前行并返回
被跳过了。此方法返回当前行的其余部分,
不包括末端的任何行分隔符。该位置设置为
下一行的开头。因为这个方法会继续搜索
通过输入查找行分隔符,它可以缓冲所有
如果没有使用行分隔符,则搜索要跳过的行的输入
现在
换句话说,
nextLine()
将捕获所有内容,包括直接输入的空白字符或上一次输入的剩余字符。您凭什么相信nextLine()
会在\n
处停止?请将您的问题包括在运行此程序时按下的键盘键的确切顺序。还包括您从应用程序获得的输出。@Garvitara当您按下enter
,而不是之前,您输入的行是“发送”到java应用程序。因此,当您为数字输入数字时,这些输入尚未发送到java应用程序,因此java应用程序仍在等待第一次输入。@Progman抱歉,请详细说明。我从您的评论中了解到的是,当我按“回车”键时,它会将我的输入发送到程序,并创建\n未使用的字符。但nextInt在“发送”命令而不是\n停止读取。因此,nextInt(i2)的输入在“send”之前在技术上是\n+
,但由于它跳过了空格,所以只存储空格。这是正确的理解吗?@GarvitArora你有什么问题?很难理解你想问什么。请在你的帖子中添加对你所问问题的详细描述。
import java.util.Scanner;
public class Main {
public static void main(String... args) {
Scanner input = new Scanner(System.in);
System.out.println(input.delimiter());
}
}
public class Main {
public static void main(String... args) {
System.out.println(Character.isWhitespace('\n'));
System.out.println("\n\n\n\n\n".split("\\p{javaWhitespace}+").length);
System.out.println("10\n".split("\\p{javaWhitespace}+").length);
System.out.println("hello\n".split("\\p{javaWhitespace}+").length);
}
}
true
0
1
1