构造对象时读取文本文件double类型触发FormatException,求排查解决
嘿,这问题我熟!你触发FormatException肯定是因为文本里的数值格式不对——你说文件内容是5....,这带一堆小数点的字符串,Double.Parse()根本认不出来啊!
为啥会报错?
- 核心原因就是你文本里的第一个字段是
5....,这完全不是有效的浮点数格式:double类型只允许一个小数点(或者没有小数点),多个点直接违反了解析规则,自然就抛出异常了。 - 另外也得留意有没有其他坑:比如数据里混了空格、字母这类非数字字符,或者你的系统区域设置里小数点分隔符不是
.(不过你用逗号拆分数据,这个可能性不大,但还是可以检查下)。
怎么解决?
- 先把文本文件改对:把
5....改成合法的浮点数,比如5、5.0或者5.123这种,确保每行第一个字段都是标准格式。 - 用更安全的解析方式:别再直接用
Double.Parse()了,换成Double.TryParse(),既能避免程序崩溃,还能帮你找出哪行数据有问题:ArrayList Webpages = new ArrayList(); String FileName = "Medium.txt"; StreamReader newSR = new StreamReader(FileName); while (!newSR.EndOfStream) { string line = newSR.ReadLine(); string[] data = line.Split(','); // 先检查数据项数量够不够 if (data.Length < 3) { Console.WriteLine($"跳过无效行:{line},数据项不足"); continue; } // 尝试解析,失败就输出错误信息 if (Double.TryParse(data[0], out double pageRank) && int.TryParse(data[1], out int pageId)) { Webpage newEntry = new Webpage(pageRank, pageId, data[2]); Webpages.Add(newEntry); } else { Console.WriteLine($"解析失败的行:{line},请检查格式"); } } newSR.Close(); // 别忘了关闭流哦 - 自动清理错误格式(可选):如果多余的小数点是输入失误,你可以在解析前先处理字符串,比如只保留第一个小数点:
string rawRank = data[0]; int firstDotIndex = rawRank.IndexOf('.'); if (firstDotIndex != -1) { // 去掉第一个点之后的所有点 rawRank = rawRank.Substring(0, firstDotIndex + 1) + rawRank.Substring(firstDotIndex + 1).Replace(".", ""); } // 再用处理后的字符串去解析
内容的提问来源于stack exchange,提问作者pops
相关产品推荐
相关产品推荐

