为什么我得到的索引超出了数组异常的范围?

时间:2013-05-08 02:54:45

标签: .net

下面的代码有效,但每次都会抛出一个异常消息框。消息框显示“索引超出了数组的范围”。我想不看邮箱,但我也想没有空的异常捕获。我做错了什么?

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);
                }
            }
        }

    }

================================== UPDATE ============ ============================== 在阅读并向我的PSL代码添加后,我最终得到了一个新的异常(引用的对象未设置为对象的实例。

这是我的新代码。我改为while循环寻找null并在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);
                }
            }
        }

    }

2 个答案:

答案 0 :(得分:1)

似乎数组lines没有3个元素。不要尝试访问大于或等于数组长度的数组索引。

答案 1 :(得分:1)

你在这个地方做错了。

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

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

甚至没有检查length的{​​{1}}你试图从中提取物品。这必须是您收到错误的地方。如果您正在阅读的行中少于2 lines array,该怎么办?这将失败\t

相反,你可以做的是

Index out of bounds