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

C#解析器报错System.IndexOutOfRangeException:数组索引超出范围

解决数组越界异常(System.IndexOutOfRangeException)

异常原因分析

这段代码抛出数组越界异常,核心问题是直接用数组索引取值时,没提前确认数组长度足够,或是必要的前置数据没初始化:

  • 处理OUT:行时,可能还没处理过TIMESTAMP行,导致TSitems未赋值,或是TSitems分割后元素数量不足4个(无法取TSitems[3])。
  • COitems分割后的元素数量可能不足5个,直接取COitems[3]、COitems[4]会触发越界。
  • COitems[4]按@分割后,可能只有1个元素(字符串里无@符号),取索引[1]会越界。

修复方案

  1. 确保TIMESTAMP数据有效再处理OUT行
    处理OUT:行前,先校验TSitems的有效性:

    else if (line.Contains("OUT:"))
    {
        // 校验TSitems是否初始化且元素足够
        if (TSitems == null || TSitems.Length < 4)
        {
            // 跳过无效行或记录错误日志
            line = reader.ReadLine();
            continue;
        }
        // 原有后续代码...
    }
    
  2. 校验COitems的长度
    分割OUT:行后,先确认数组长度再取值:

    COitems = line.Split(new char[0], StringSplitOptions.RemoveEmptyEntries);
    if (COitems.Length < 5)
    {
        // 跳过无效行或记录日志
        line = reader.ReadLine();
        continue;
    }
    
  3. 安全处理@分割逻辑
    先判断字符串是否包含@,再执行分割,同时校验子串长度:

    var userPcPart = COitems[4];
    if (!userPcPart.Contains("@"))
    {
        // 处理格式错误,比如跳过该行
        line = reader.ReadLine();
        continue;
    }
    var userPcSplit = userPcPart.Split('@');
    checkoutInfo.PcName = userPcSplit[1];
    checkoutInfo.UserName = userPcSplit[0].ToLower().Trim();
    // 校验PcName长度后再截取SiteCode
    checkoutInfo.SiteCode = checkoutInfo.PcName.Length >= 3 ? checkoutInfo.PcName.Substring(0,3) : "";
    
  4. 提前初始化数组
    在代码开头初始化数组,避免未赋值就使用:

    string[] TSitems = new string[0];
    string[] COitems = new string[0];
    int TScount = 0;
    

内容的提问来源于stack exchange,提问作者Carlos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:45:11