0

現在、'|' を取得しようとしている最中です。区切りテキスト ファイルを作成し、そこに含まれるデータからオブジェクトを作成します。例:

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

次に、新しく作成されたオブジェクトが上記のオブジェクトのリストに追加され、プログラムは .Peek() を使用して while ループを介してファイルの次の行に移動します (ファイル)。

ただし、2 番目のオブジェクト (より具体的には、2 番目のオブジェクトの 2 番目のフィールド) を作成すると、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

4 に答える 4

1

まず、現在の catch ブロックで IndexOutOfRange Exception かどうかを確認できません。

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);
}
于 2012-12-07T04:21:12.920 に答える
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);
}
于 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 に答える