所以我希望我的程序读取一个输入,它在一行中有一些整数,例如:
1 1 2
然后它应该分别读取每个整数并以新行打印。程序必须读取的整数数量不是事先给出的,所以我要做的是使用while循环,在没有更多的整数读取之后结束。这是我写的代码:
while (scan.hasNextInt()) {
int x = scan.nextInt();
System.out.println(x);
}
但它无法正常工作,因为循环永远不会结束,它只是希望用户输入更多的整数。我在这里错过了什么?
答案 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。