尝试从C#中的文本文件创建Object时的IndexOutOfRangeException

时间:2012-12-07 04:17:06

标签: c# list object text

我目前正在试图采取'|'分隔文本文件并根据其中包含的数据创建对象。例如:

Name|Address|City|State|Zip|Birthday|ID|Etc.
Name2|Address2|City2|State2|Zip2|Birthday2|ID2|Etc.

然后将新创建的对象添加到所述对象的列表中,程序通过使用.Peek()的while循环移动到文件的下一行(以确保我不会超过文件的结尾)。

然而,当它创建第二个对象(更具体地说,第二个对象的第二个字段)时,它会抛出一个Index Out of Range Exception,而我无法为我的生活找出原因。谢谢你们谁读过这本书!

    StreamReader textIn = new StreamReader(new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read));

        List<Student> students = new List<Student>();

        while (textIn.Peek() != -1)
        {
            string row = textIn.ReadLine();
            MessageBox.Show(row);
            string [] fields = row.Split('|');
            Student temp = new Student();

            try
            {
                temp.name = fields[0];
                temp.address = fields[1];
                temp.city = fields[2];
                temp.state = fields[3];
                temp.zipCode = Convert.ToInt32(fields[4]);
                temp.birthdate = fields[5];
                temp.studentID = Convert.ToInt32(fields[6]);
                temp.sGPA = Convert.ToDouble(fields[7]);
            }
            catch
            {
                MessageBox.Show("IndexOutOfRangeException caught");
            }

            students.Add(temp);
        }

        textIn.Close();

4 个答案:

答案 0 :(得分:1)

首先,您无法确保它是否与您当前的catch块一起使用IndexOutOfRange异常。

catch
{
    MessageBox.Show("IndexOutOfRangeException caught");
}

它可以是任何东西,在解析为double时可能是异常。您可以将catch块修改为:

catch(IndexOutOfRangeException ex)
{
    MessageBox.Show(ex.Message);
}

此外,如果您要访问fields[7],那么如果您可以检查数组的长度以确保您在阵列中至少有8个元素,那么它会更好。

 if(fileds.Length >=8)
       {
        temp.name = fields[0];
        ....

要捕获在双重解析期间可能发生的FormatException,您可以为以下内容添加额外的catch块:

catch (FormatException ex)
{
    MessageBox.Show(ex.Message);
}

答案 1 :(得分:0)

在给定的数据中,如果每行至少有8列,则不会得到范围异常的索引而是parsing of item at 4, 6, 7 would fail,因为它们是not个数字并将非数字值转换为int和double引发了异常。

temp.zipCode = Convert.ToInt32(fields[4]); 
temp.studentID = Convert.ToInt32(fields[6]);
temp.sGPA = Convert.ToDouble(fields[7]);

您需要更改catch块以了解异常原因

}
catch(Exception ex)
{
    MessageBox.Show(ex.Message);
}

答案 2 :(得分:0)

  1. 检查一行中是否有8个fieds。
  2. 如果不是,请显示消息。
  3. 获取实际异常并显示其消息以查看真正的问题描述。
  4. 使用Double.TryParse Method Int32.TryParse Method确保所有数值均有效
  5. 也请改用while (!textIn.EndOfStream)

  6.  try
     {
        int tempInt;
        double tempDouble;
        if (fields.Length = 8)//#1
        {
            temp.name = fields[0];
            temp.address = fields[1];
            temp.city = fields[2];
            temp.state = fields[3];
            if (!int.TryParse(fields[4], out tempInt))    //#4
                temp.zipCode = tempInt;
            else
            {
               //..invalid value in field
            }
            temp.birthdate = fields[5];
            if (!int.TryParse(fields[6], out tempInt))    //#4
                temp.studentID = tempInt;
            else
            {
               //..invalid value in field
            }
            if (!int.TryParse(fields[7], out tempDouble)) //#4
                temp.sGPA = tempDouble;
            else
            {
               //..invalid value in field
            }
        }
        else //#2
        {
            MessageBox.Show("Invalid number of fields");
        }
    }
    catch (Exception ex)   //#3
    {
        MessageBox.Show(ex.Message);
    }
    

答案 3 :(得分:0)

如果数据在每一行上,那么ReadAllLines可能会更好一些:

            List<Student> students = new List<Student>();
            using (FileStream textIn = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                foreach (string line in File.ReadAllLines(path))
                {
                    MessageBox.Show(line);
                    string[] fields = line.Split('|');
                    Student temp = new Student();
                    try
                    {
                        temp.name = fields[0];
                        temp.address = fields[1];
                        temp.city = fields[2];
                        temp.state = fields[3];
                        temp.zipCode = Convert.ToInt32(fields[4]);
                        temp.birthdate = fields[5];
                        temp.studentID = Convert.ToInt32(fields[6]);
                        temp.sGPA = Convert.ToDouble(fields[7]);
                    }
                    catch
                    {
                        MessageBox.Show(string.Format("IndexOutOfRangeException caught, Split Result:", string.Join(", ", fields.ToArray())));
                    }
                    students.Add(temp);
                }
            }