C#解析器报错System.IndexOutOfRangeException:数组索引超出范围
解决数组越界异常(System.IndexOutOfRangeException)
异常原因分析
这段代码抛出数组越界异常,核心问题是直接用数组索引取值时,没提前确认数组长度足够,或是必要的前置数据没初始化:
- 处理
OUT:行时,可能还没处理过TIMESTAMP行,导致TSitems未赋值,或是TSitems分割后元素数量不足4个(无法取TSitems[3])。 COitems分割后的元素数量可能不足5个,直接取COitems[3]、COitems[4]会触发越界。COitems[4]按@分割后,可能只有1个元素(字符串里无@符号),取索引[1]会越界。
修复方案
确保TIMESTAMP数据有效再处理OUT行
处理OUT:行前,先校验TSitems的有效性:else if (line.Contains("OUT:")) { // 校验TSitems是否初始化且元素足够 if (TSitems == null || TSitems.Length < 4) { // 跳过无效行或记录错误日志 line = reader.ReadLine(); continue; } // 原有后续代码... }校验COitems的长度
分割OUT:行后,先确认数组长度再取值:COitems = line.Split(new char[0], StringSplitOptions.RemoveEmptyEntries); if (COitems.Length < 5) { // 跳过无效行或记录日志 line = reader.ReadLine(); continue; }安全处理@分割逻辑
先判断字符串是否包含@,再执行分割,同时校验子串长度: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) : "";提前初始化数组
在代码开头初始化数组,避免未赋值就使用:string[] TSitems = new string[0]; string[] COitems = new string[0]; int TScount = 0;
内容的提问来源于stack exchange,提问作者Carlos
相关产品推荐
相关产品推荐

