我目前正在试图采取'|'分隔文本文件并根据其中包含的数据创建对象。例如:
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();
答案 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)
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);
}
答案 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);
}
}