-2

以下のコードは機能しますが、毎回例外メッセージ ボックスがスローされます。メッセージ ボックスには、「インデックスが配列の範囲外でした」と表示されます。メッセージボックスを表示したくないのですが、空の例外をキャッチしたくありません。私は何を間違えましたか?

private void btnReadFile_Click(object sender, EventArgs e)
    {
        Stream myStream;

        OpenFileDialog oFD = new OpenFileDialog();

        if (oFD.ShowDialog() == DialogResult.OK)
        {
            if ((myStream = oFD.OpenFile()) != null)
            {
                try
                {
                    StreamReader sr = new StreamReader(myStream);

                    while (sr.Peek() >=0)
                    {
                        for (int i = 0; i < myStream.Length; i++)
                        {

                            string[] lines = sr.ReadLine().Split(new Char [] { '\t' },    StringSplitOptions.None);

                            string one = lines[0];
                            string two = lines[1];
                            string three = lines[2];

                            ListViewItem item = new ListViewItem(new string[] { one, two, three });

                            lvRollResults.Items.Add(item);

                        }

                    }

                    sr.Close();
                }

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

    }

==================================更新=============== =========================== PSL のコードを読んで私のコードに追加した後、新しい例外が発生しました (参照されるオブジェクトがオブジェクトのインスタンス。

これが私の新しいコードです。null を探す while ループに変更し、while ループ内に reaLine() を追加しました。このコードは、例外なく動作するようになりました。

private void btnReadFile_Click(object sender, EventArgs e)
    {
        Stream myStream;

        OpenFileDialog oFD = new OpenFileDialog();

        if (oFD.ShowDialog() == DialogResult.OK)
        {
            if ((myStream = oFD.OpenFile()) != null)
            {
                try
                {
                    StreamReader sr = new StreamReader(myStream);

                    while ((sr.ReadLine()) != null)//if line is null stop reading
                    {
                        string[] lines = sr.ReadLine().Split(new Char[] { '\t' }, StringSplitOptions.None);

                                string one = lines[0];
                                string two = string.Empty;
                                string three = string.Empty;

                                if (lines.Length > 1)
                                    two = lines[1];

                                if (lines.Length > 2)
                                    three = lines[2];

                                ListViewItem item = new ListViewItem(new string[] { one, two, three });

                                lvRollResults.Items.Add(item);
                                sr.ReadLine();//read a line to see if it is null

                    }

                    sr.Close();

                }

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

    }
4

2 に答える 2

1

あなたはこの場所で間違ったことをしています。

 string[] lines = sr.ReadLine().Split(new Char [] { '\t' },    StringSplitOptions.None);

 string one = lines[0];
 string two = lines[1];
 string three = lines[2];

をチェックすることさえせずlengthに、lines arrayそこからアイテムを引き出そうとしています。これは、エラーが発生している場所でもある必要があります。\t読んでいる行が2 未満の場合はどうなりますか。これは で失敗しIndex out of boundsます。

代わりにできることは

string one = lines[0];
string two= string.Empty;
string three = string.Empty;

if(lines.Length > 1)
 two = lines[1]
if(lines.Length > 2)
 three = lines[2];
于 2013-05-08T02:57:54.183 に答える