C#读取TXT生成Tweet列表时抛出IndexOutOfRangeException求助
问题修复:C#读取TXT文件填充Tweet列表时的异常处理
问题概述
作业需求为读取.txt文件、填充字段并展示数据,使用Tweet和TweetManager两个C#类,但运行时在Parse方法抛出IndexOutOfRangeException,读取一行数据即报错。
错误原因及修复方案
1. 分隔符不匹配导致数组越界
Tweet.Parse方法中使用\t(制表符)分割行内容,但实际.txt文件中使用空格分隔字段,导致分割后的数组元素数量不足(示例行分割后仅4个元素,却尝试访问parts[4])。
修复代码(Tweet类)
考虑到Body字段可能包含空格,调整分割逻辑:假设前3个字段为单个单词,最后一个是ID,中间部分合并为Body:
public static Tweet Parse(string line) { // 按任意数量空格分割,并过滤空字符串 string[] parts = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length < 5) { throw new FormatException("Invalid line format: expected at least 5 fields"); } // 提取固定位置的字段 string from = parts[0]; string to = parts[1]; string tag = parts[2]; string id = parts[^1]; // 合并中间内容作为Body string body = string.Join(" ", parts.Skip(3).Take(parts.Length - 4)); return new Tweet(from, to, body, tag, id); }
2. 静态构造函数中的死循环
TweetManager静态构造函数里的do-while循环条件lines != null永远为true(lines是数组对象,不会为null),导致无限重复添加同一行数据,最终引发异常。
修复代码(TweetManager类)
删除多余的do-while,直接遍历每行并跳过空行:
static TweetManager() { Tweets = new List<Tweet>(); string[] lines = File.ReadAllLines(filename); foreach (string line in lines) { if (string.IsNullOrWhiteSpace(line)) continue; Tweets.Add(Tweet.Parse(line)); } }
3. 方法返回类型不匹配
Initialize方法声明为void却尝试返回字符串,导致编译错误。
修复代码(TweetManager类)
修改返回类型为string:
public static string Initialize() { return $"Loaded {Tweets.Count} tweets from file {filename}"; }
4. Tweet类的语法错误
using System.Linq末尾是反引号而非分号;`,导致编译失败。ToString方法中定义了body变量但未使用,仍输出原始Body字段。
修复代码(Tweet类)
// 修正using语句的分号 using System.Linq; // 修正ToString方法,使用截断后的body变量 public override string ToString() { string body = Body.Length > 40 ? Body.Substring(0, 37) + "..." : Body; return $"From: {From} To: {To} Body: {body} Tag: {Tag} ID: {Id}"; }
其他优化建议
- 添加异常捕获:在
Parse方法和静态构造函数中处理格式错误,避免程序直接崩溃。 - 验证文件存在性:在读取文件前检查
filename对应的路径是否有效,可增加File.Exists(filename)判断。
内容的提问来源于stack exchange,提问作者CobeWan
相关产品推荐
相关产品推荐

