Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么多个nextInt()可以工作?_Java - Fatal编程技术网

Java 为什么多个nextInt()可以工作?

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();

在下面的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
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