使用Scanner从单行读取整数列表时为什么会出现无限循环?

时间:2012-01-13 15:33:40

标签: java java.util.scanner

我需要用户在一行中输入整数列表,所以我写了这个:

public static Integer[] readIntegers()
{
    Scanner input = new Scanner(System.in);
    List<Integer> list = new ArrayList<Integer>();
    do list.add(input.nextInt());
    while(input.hasNextInt());
    return list.toArray(new Integer[list.size()]);
}

但它会永远循环!如果扫描仪上没有数字,hasNextInt()是否应该返回false?我该如何修复以前的方法?或者我应该使用nextLine()代替并填充字符串吗?

3 个答案:

答案 0 :(得分:3)

System.in没有“结束”因为你按回车键。 如果您想这样做,您可以在'\n'表达式中检查while

一般来说,我宁愿以另一种方式这样做:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();  // line == null indicates end of input.

或使用java.io.Console

此外,如果您使用do / while而不是在输入为空时可能会遇到问题。

答案 1 :(得分:1)

我相信你只是没有把EOF放到你的stdin,所以你的程序正在等待下一个输入..

要提供EOF,请在Windows上使用ctrl+z或在Linux上使用ctrl+d

答案 2 :(得分:1)

如果您只读一行并将其内容放在Scanner中会更好。这样,用户就不必输入EOF,而只需按Enter键。

此外,您需要while循环而不是do...while,因为可能没有输入数字。由于do...while在一次迭代后首先检查条件,因此即使没有任何整数,代码也会尝试读取至少一个整数。