0

我目前正在尝试使用“|” 分隔文本文件并从其中包含的数据创建对象。例子:

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

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

但是,当它开始创建第二个对象(更具体地说,第二个对象的第二个字段)时,它会抛出一个 Index Out Of Range 异常,我终生无法弄清楚为什么。感谢任何可能阅读此内容的人!

    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

4 回答 4

1

首先,您无法确定当前 catch 块是否为 IndexOutOfRange 异常。

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

它可以是任何东西,在解析为加倍时可能是例外。您可以将 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);
}
于 2012-12-07T04:21:12.920 回答
0

在给定的数据中,如果每行至少有八列,则不会获得范围异常的索引,但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);
}
于 2012-12-07T04:21:28.613 回答
0
  1. 检查你是否在一行中有所有 8 个字段。
  2. 如果不是,则显示一条消息。
  3. 获取实际异常并显示其消息以查看真正的问题描述。
  4. 使用Double.TryParse 方法Int32.TryParse 方法确保所有数值都有效
  5. 也可以while (!textIn.EndOfStream)改用。

 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);
}
于 2012-12-07T04:23:29.827 回答
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);
                }
            }
于 2012-12-07T04:29:46.897 回答