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

我显然在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()不会将指针移动到下一行,因此扫描仪不会超过任何输入。 正如在这个问题的答案以及这里所解释的那样。

好吧,根据

 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的回答

您无需对内容进行双重检查。 这应该工作:

  File file = new File("data.txt"); Scanner input = new Scanner(file); int sum = 0; while(input.hasNextInt()) { sum += input.nextInt(); } System.out.println(sum); 

希望这可以帮助。

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

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

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

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

只需在扫描仪吸引它时读取非整数元素。 希望这澄清一下。