如何在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。