Java读取文本文件求和异常:Scanner分隔符问题排查
解决Java读取文本文件数值求和的分隔符与循环问题
你的问题核心在于分隔符设置不全面,以及循环逻辑和Scanner的分隔符机制不匹配,导致程序只处理了前几个数值,还陷入了无限循环。咱们一步步拆解问题,再给出修复方案:
问题根源分析
- 分隔符覆盖了行分隔符:你设置了
scan.useDelimiter(", "),这会让Scanner只把,当作分隔符,而文件里的换行、单纯的空格(比如1.8和1.3之间的空格)都不被识别成分隔符。这导致hasNextLine()永远返回true——因为Scanner根本没把换行当作行结束的标志,它还在等待下一个,分隔符。 - 非数值token阻塞了流程:当Scanner遇到
1.8 1.3这个无法被,拆分的内容时,hasNextDouble()会返回false,循环就卡在while (scan.hasNextLine())里,既处理不了后面的内容,也无法退出循环。
修复方案
我们需要调整两个关键部分:
- 用正则表达式分隔符,匹配所有可能的分隔符号(
,、空格、换行) - 调整循环逻辑,遍历所有拆分后的token,而不是按行判断
修改后的完整代码
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class Main3 { public static void main(String[] args) { File main3File = new File("Main3.txt"); double sum = 0; try { Scanner scan = new Scanner(main3File); // 匹配", " 或者 任意数量的空白字符(包括空格、换行) scan.useDelimiter(", |\\s+"); // 遍历所有拆分后的token,不管在第几行 while (scan.hasNext()) { if (scan.hasNextDouble()) { sum += scan.nextDouble(); // 如果需要调试,可以保留这行输出中间结果 // System.out.println("当前累加和:" + sum); } else { // 跳过非数值的token(比如"aa") scan.next(); } } scan.close(); // 别忘了关闭资源 } catch (FileNotFoundException ex) { System.out.println("文件未找到错误"); } System.out.println("Suma: " + sum); } }
关键修改点解释
- 分隔符正则表达式:
", |\\s+"表示匹配两种情况:,:逗号加空格(对应你文件里大部分的分隔)\\s+:一个或多个空白字符(包括普通空格、换行符,解决跨行和无逗号的空格分隔问题)
- 循环逻辑改为
while (scan.hasNext()):这个方法会遍历所有被分隔符拆分后的token,不管它们在第几行,完美适配我们的分隔符设置。 - 跳过非数值token:当遇到
aa这种非double类型的内容时,用scan.next()跳过它,避免流程阻塞。
测试结果
针对你的txt文件内容,所有double数值的总和是49.3,程序运行后会正确输出这个结果,同时不会再出现无限循环的问题。
内容的提问来源于stack exchange,提问作者Kacper Zięba
相关产品推荐
相关产品推荐

