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

Abd*_*ari 2 java infinite-loop java.util.scanner 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);
Run Code Online (Sandbox Code Playgroud)

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

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

我正在尝试计算唯一整数值​​的总和(空格分隔的位置).

编辑:

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

Niz*_*ziL 5

好吧,根据

while(input.hasNext()) {
  if(input.hasNextInt()) {
    sum += input.nextInt();
  }
}
Run Code Online (Sandbox Code Playgroud)

如果此令牌不是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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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