You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:18:33