gpt4 book ai didi

java - 为什么多个 nextInt() 有效?

转载 作者:行者123 更新时间:2023-12-04 01:08:47 26 4
gpt4 key购买 nike

在下面的 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(); //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

一直在等待输入,直到我按下 enter 键。我尝试了 tab、多个 tabspace 但它一直在等待并且没有移动到下一个命令 因此我假设 nextInt 在移动到下一个命令之前一直等到它在输入流中找到\n。

查看来自 Scanner is skipping nextLine() after using next() or nextFoo()? 的答案,我们必须添加 Cmd8 的原因是因为 nextInt() 继续读取输入直到 \n,将输入发送到程序并放置 \n回到输入流的前面。现在,当“Cmd8”中的 nextLine() 开始读取它时,它在输入流的开头发现 \n 没有任何前面的字符串,它假定用户没有输入任何内容因此将空字符串作为输入并且转到 Cmd9

我的疑问是因为 nextInt() 也读取到 \n(根据我的经验暗示 Cmd3 一直在等待直到我按下 enter) 为什么 Cmd5 正在等待我的输入。它还应该在输入流的开头找到 \n 并假设我没有输入任何内容并将空整数作为输入(类似于 Cmd8 的行为方式) .这里发生了什么?

最佳答案

我已经通过调试 JRE Scanner 类方法分析了您的问题。当您调用 nextInt 函数时,Scanner 查找当前缓冲区。如果没有可用的输入,开始监听键盘,直到您按下 Enter 键,整个键盘字符附加到缓冲区并尝试匹配它是否是整数。当找到整数时,nextInt 返回值并增加缓冲区的位置索引。下一步,你再次调用了nextInt,只有\n字符,然后它被丢弃,等待下一个整数模式。此外,缓冲区的下一个字符又是 \n 。当您调用 nextLine 时,它会查看缓冲区并打印一个空行。所以第二个 nextLine 以空文本开始。

也许它会令人困惑。让我们看一下场景:

注意:索引^表示缓冲区的读取位置。


  1. 步骤
i1 = input.nextInt();
keyboard = 1 2 {Enter}
buffer = | 1 | 2 | \n |
index = ^

返回12,下一个缓冲区位置位于\n


  1. 步骤
i2 = input.nextInt();
keyboard = 3 4 {Enter}
buffer = | 1 | 2 | \n | 3 | 4 | \n |
index = ^

返回 34 并且下一个缓冲区位置位于第二个 \n


  1. 步骤
input.nextLine();

Buffer 有 \n 字符,所以 Scanner 不等待键盘返回值。

buffer = | 1 | 2 | \n | 3 | 4 | \n |
index = ^

返回空文本


  1. 步骤
s1 = input.nextLine();
keyboard = test {Enter}
buffer = | 1 | 2 | \n | 3 | 4 | \n | t | e | s | t | \n |
index = ^

返回测试


关于java - 为什么多个 nextInt() 有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65484078/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com