Scanner.hasNext上的无限循环,从文件中读取

时间:2014-05-15 11:24:16

标签: java java.util.scanner infinite-loop java-io

我显然在while(input.hasNext())面临无限循环,如下面的代码

File file = new File("data.txt");
Scanner input = new Scanner(file);

int sum = 0;

while (input.hasNext()) {
    if (input.hasNextInt()) {
        sum += input.nextInt();
    }
}
System.out.println(sum);

一些相关问题解释了为什么如果输入流为System.in,它总是返回true,但是我正在浏览File

请让我知道我哪里出错了。

我试图计算唯一整数值​​的总和(以空格分隔的位置)。

修改

经验教训,  input.hasNext()不会将指针移动到下一行,因此扫描程序不会超过任何输入。正如在这个问题的答案以及here中所解释的那样。

3 个答案:

答案 0 :(得分:5)

嗯,根据

while(input.hasNext()) {
  if(input.hasNextInt()) {
    sum += input.nextInt();
  }
}

如果此令牌不是int,您的扫描仪将不会使用下一个令牌,您可以使用类似

的内容来处理此行为
int k=0;
while(input.hasNext()) {
  if(input.hasNextInt()) {
    sum += input.nextInt();
  } else {
    System.err.println("What ? It's not an integer...");
    if ( k < 1 ) {
      System.err.println("I'm gonna try again !");
      k++;
    } else {
      System.err.println("'"+input.next()+"' it's definitively not an integer");
      k=0;
    }
  }
}

最后,有许多解决方案,例如:

  • 修改输入文件,删除所有非整数标记
  • 使用Scanner::next()
  • 消耗非整数标记
  • Sanjeev的回答

答案 1 :(得分:4)

您无需仔细检查内容。这应该有效:

   File file = new File("data.txt");
    Scanner input = new Scanner(file);

    int sum = 0;

    while(input.hasNextInt()) {
            sum += input.nextInt();
    }
    System.out.println(sum);

希望这有帮助。

答案 2 :(得分:0)

似乎扫描程序正在读取文件中的非int值,当它发生时,(input.hasNext())将始终为true,因为有一些东西作为扫描程序的输入,但它不是int。因此,扫描程序会在内部 if(input.hasNextInt())检查中跳过读取此非int值。

因此扫描程序不会超出此元素并始终返回true。

如果要总结文件中的所有整数,则应将代码修改为:

while(input.hasNext()) {            
            if(input.hasNextInt()) {                
                sum += input.nextInt();
            }
            else
                input.next();
        }

当扫描仪吸引它时,只需读取非整数元素即可。 希望这澄清。