错误:(使用List类)索引超出了数组的范围

时间:2016-06-16 06:23:11

标签: c# arrays

我正在从事一个项目,而且我是c#编程的初学者,不知何故有一个我无法解决的问题。它是如何发生的:在执行代码时,应用程序成功启动但是异常 表明"索引超出了数组的范围"。之后,我能够单击列表框上的项目,并在文本框中显示第二个对象。所以......似乎它有效(点击列表框' s项目),但我无法弄清楚为什么它会抛出关于数组的异常。 Beneath是我当前的代码。

**更新:我真诚地道歉。我上传了错误的代码。它应该是这段代码:

代码:

struct studentInfo
{  
  public string studentID;
  public string major;
}  

public partial class Form1 : Form
{
    private List<studentInfo> studentList = new List<studentInfo>();

    public Form1()
    {
        InitializeComponent();
    }


    private void ReadInputFile()
    {
        try
        {
            StreamReader inputFile;
            string line = "";

            studentInfo student = new studentInfo();

            char[] delimiter = { ',' };

            inputFile = File.OpenText("Student Info.txt");

            while (!inputFile.EndOfStream)
            {
                line = inputFile.ReadLine();

                string[] token = line.Split(delimiter);

                student.studentID = token[0];
                student.major = token[1];

                studentList.Add(student);

            }

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    private void DisplaystudentID()
    {
        foreach (studentInfo student in studentList)
        {
            studentInfoListBox.Items.Add(student.studentID);
        }
    }

    private void DisplayNames()
    {

    }
    private void button1_Click(object sender, EventArgs e)
    {
        ReadInputFile();

        DisplaystudentID();
    }

    private void studentInfoListBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        int index = studentInfoListBox.SelectedIndex;

        majorTextBox.Text = studentList[index].major;


    }

    private void button3_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }
}

5 个答案:

答案 0 :(得分:3)

我的猜测是在开始时(在您选择任何内容之前)运行SelectedIndexChanged,并且此时nameListBox.SelectedIndex将为-1并且您无法获得&#34;负1位置&#39;项目&#34;在列表中。我会确保所选索引有效

https://msdn.microsoft.com/fr-fr/library/system.windows.forms.listbox.selectedindex(v=vs.110).aspx &#34;当前所选项目的从零开始的索引。如果未选择任何项目,则返回负值1(-1)的值。&#34;

我会改变代码:

private void nameListBox_SelectedIndexChanged(object sender, EventArgs e)
{
    int index = nameListBox.SelectedIndex;
    if(index !=-1)
    {
        phoneLabel.Text = phoneList[index].phone;
    }
    // else do nothing, the selected item didn't really change, it's just called for the first time, think of it as the control saying "hey i just got created and i'm notifying you that the selected item is now nothing"
}

答案 1 :(得分:2)

您必须保护SelectedIndex,当最初创建控件时,SelectedIndex设置为-1

private void nameListBox_SelectedIndexChanged(object sender, EventArgs e)
{
    if(nameListBox.SelectedIndex >=0)
    {
         int index = nameListBox.SelectedIndex;

         phoneLabel.Text = phoneList[index].phone;
    } 
}

答案 2 :(得分:1)

您在程序中唯一的数组处理是:

entry.name = tokens[0];
entry.phone = tokens[1];

因此原因是文本文件中的某一行没有逗号,因此tokens没有2个部分。

这样做的一个常见原因就是让一个文件在最后的真实条目之后有一个换行符,从而将一行空行作为最后一行。

我会在这里处理:

if (tokens.Length < 2)
    continue;

答案 3 :(得分:1)

您没有让我们知道发生异常的确切位置,但我认为可能在此部分

line = inputFile.ReadLine();

string[] tokens = line.Split(delim);

entry.name = tokens[0];
entry.phone = tokens[1];

如果您的专线为空或没有&#34;,&#34;你会在下一行得到例外

您还需要检查indexnameListBox_SelectedIndexChanged位置的列表访问权限。

答案 4 :(得分:0)

“索引超出了数组的范围”当您尝试访问未在列表中退出的元素时,会发生异常。当您点击列表中的最后一项时,我相信您会收到此异常。

在您的 nameListBox_SelectedIndexChanged 方法中,您可以使用以下方法之一。

int index = nameListBox.SelectedIndex -1;

phoneLabel.Text = phoneList[index-1].phone;