如何在while循环中使用.nextInt()和hasNextInt()

时间:2014-10-25 20:11:35

标签: java input while-loop java.util.scanner

所以我希望我的程序读取一个输入,它在一行中有一些整数,例如:

1 1 2

然后它应该分别读取每个整数并以新行打印。程序必须读取的整数数量不是事先给出的,所以我要做的是使用while循环,在没有更多的整数读取之后结束。这是我写的代码:

while (scan.hasNextInt()) {
    int x = scan.nextInt();
    System.out.println(x);
}

但它无法正常工作,因为循环永远不会结束,它只是希望用户输入更多的整数。我在这里错过了什么?

3 个答案:

答案 0 :(得分:5)

hasNextInt调用阻止,直到它有足够的信息来决定"是/否"。

Ctrl+Z on Windows (or Ctrl+D on "unix")关闭standard input stream并触发EOF。或者,输入非整数,按Enter

控制台输入通常是行缓冲的:输入必须按下(或EOF触发),整个行将立即处理

示例,其中^ Z表示Ctrl + Z(或Ctrl + D):

1 2 3<enter>4 5 6^Z   -- read in 6 integers and end because stream closed
                      -- (two lines are processed: after <enter>, after ^Z)
1 2 3 foo 4<enter>    -- read in 3 integers and end because non-integer found
                      -- (one line is processed: after <enter>)

另见:

答案 1 :(得分:1)

您的扫描仪基本上会等待文件结束。如果您在控制台中使用它,那么它将继续运行。尝试从文件中读取整数,您会注意到您的程序将终止。

如果您不熟悉从文件中阅读,请在项目文件夹中创建test.txt并在代码中使用Scanner scan = new Scanner(new File("test.txt"));

答案 2 :(得分:0)

如果你想在线后停止循环,请像这样创建Scanner

public static void main(final String[] args) {
    Scanner scan = new Scanner(System.in).useDelimiter(" *");
    while (scan.hasNextInt() && scan.hasNext()) {
        int x = scan.nextInt();
        System.out.println(x);
    }

}

诀窍是定义一个包含空格的分隔符,空表达式,但不包含下一行字符。 这样Scanner看到\n后跟一个分隔符(无),输入在按下返回后停止。

实施例: 1 2 3 \ n 将提供以下令牌: 整数(1),整数(2),整数(3),非整数(\ n) 因此hasNextInt返回false。