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

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

1 1 2

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

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

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

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

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

hasNextInt调用阻塞,直到它有足够的信息来做出“是/否”的决定。

在Windows上按Ctrl + Z(或在“unix”上按Ctrl + D)以关闭标准输入流并触发EOF 。 或者,键入非整数并按Enter键

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

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

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

也可以看看:

  • 如何在不输入字符的情况下让Java的hasNextInt()停止等待整数?
  • hasNext() – 什么时候阻止,为什么?
  • Java Scanner hasNext()不返回false

如果您想在线后停止循环,请像这样创建您的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将给出以下标记:Integer(1),Integer(2),Integer(3),Noninteger(\ n)因此hasNextInt返回false。