解析文件时,索引超出了数组的范围

本文关键字:数组 范围 索引 文件 | 更新日期: 2023-09-27 17:54:45

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Net;
 using System.IO;
namespace App
{
 class Program
  {
    public static List<Types> List = new List<Types>();
    static void Main(string[] args)
    {                  
    using (StreamReader read = new StreamReader(fileName.xml))
           {
               read.ReadLine();
               while (!read.EndOfStream)
               {
                   string line = read.ReadLine();
                   string[] splitline = line.Split('|');
                   Types t = new Types();
                   t.nbr = Convert.ToInt64(splitline[0].Trim());
                   t.addr = splitline[1].Trim().Length > 1 ? splitline[3] : "";
                   List.Add(t);
               }
           }
        }
    }
  }
 public class Types
  {
    public Types()
    {
    }      
   public long nbr { get; set; } 
   public string addr { get; set; }
  }

我用'|'分隔行,分隔后的文本也不包含任何这些'|'。它特别发生在

这一行
t.addr = splitline[1].Trim().Length > 1 ? splitline[3] : "";

我没有注意到文本解析有任何错误,因为我正在处理null和这样的

下面是一个文本的示例:

 3612|
 1412|123 Circle st Miami,FL,87678
 1420|
 3587|23 Hamm st Chicago,IL,98678

解析文件时,索引超出了数组的范围

您正在尝试访问不存在的数组元素,这就是为什么您正在获得IndexOutOfRangeException异常。当尝试访问索引位于数组

边界之外的数组元素时,将引发该异常。

在访问数组元素之前检查数组长度,并使用Using try-catch块来安全处理异常。

if(splitline > 0)
      t.nbr = Convert.ToInt64(splitline[0].Trim());  
if(splitline > 3)
      t.addr = splitline[1].Trim().Length > 1 ? splitline[3] : "";

我不知道如何使用上面的示例文本获得索引3。
分隔行之后,除非使用逗号作为分隔符再次分隔第二个子字符串,否则最多只能有两个部分。

           ....       
           while (!read.EndOfStream)
           {
               string line = read.ReadLine();
               string[] splitline = line.Split('|', StringSplitOptions.RemoveEmptyEntries);
               Types t = new Types();
               Int64 num = 0;
               if(Int64.TryParse(splitline[0].Trim(), out num))
               {
                    t.nbr = num;
                    if(splitline.Length > 1)
                    {
                         // If you want the third substring of this second string
                         // i.e the 87678 from 1412|123 Circle st Miami,FL,87678
                         // string[] parts = splitline[1].Trim().Split(',');
                         // t.addr = (parts.Length > 2 ? parts[2] : "");
                         // If you want the whole string, no index 3
                         t.addr = splitline[1].Trim();
                    }
                    List.Add(t);
               }
           }

另外,对于这种程序来说,总是检查你是否有所有预期的部件是很好的实践。否则你会遇到严重的错误(索引超出范围)。
还要注意Int64.TryParse的使用,以避免在行第一部分不是数字的情况下出现异常。

List<Types> list = new List<Types>();
String[] lines = File.ReadAllLines(filePath);
foreach (String line in lines)
{
    String[] split = line.Split(new Char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
    Types t = new Types();
    t.nbr = (split.Length > 0) ? Convert.ToInt64(split[0].Trim()) : 0;
    t.addr = (split.Length > 3) ? ((split[1].Trim().Length > 1) ? split[3] : String.Empty) : String.Empty;
    list.Add(t);
}

对不起,我完全忽略了一些事情,当这行看起来像这样:1420 | jskljal, dfkjdklj

so splitline[1]里面肯定有文本,因为这一行是这样写的:.addr = splitline[1]. trim()。长度> 1 ?splitline [3] & lt; & lt; & lt;我正在查看splitLine[1]是否有长度,然后选择一个不存在的splitLine[3]