C#未处理的类型' System.ArgumentOutOfRangeException'错误

时间:2017-04-25 20:17:50

标签: c# exception

我收到错误未处理的类型' System.ArgumentOutOfRangeException'发生在RCPYC Membership Program.exe附加信息:索引超出范围。必须是非负数且小于集合的大小。在以下代码中。

private void ApplyBtn_Click(object sender, EventArgs e)
    {
        int index = 0;
        bool loop = true;
        string text;
        List<string> Data = new List<string>();
        while (loop == true)
        {
            if (index == 17)             //If statment takes a boolean value and sets it to the correct radio button
            {
                if (BtOwnerRdio.Checked == true)
                { Data[index] = "true";}
                else if(SocialRdio.Checked == true)
                {
                    Data[index] = "false";
                }
            }
            else                        //Else statement finds the correct textbox and sets the data to its text value
            {
                if (index < 10)
                { text = "tb0" + index.ToString(); }
                else
                { text = "tb" + index.ToString(); }

                Control tb = Controls.Find(text, true).FirstOrDefault() as Control; //Finds control with the name of the text string

                if (index != 0) //Does not encrypt the ID value
                {

                    try
                    {
                        MessageBox.Show("Try");
                        Data[index] = P.encrypt(tb.Text);  //Sets the list value to the textbox text value      
//This is the line that causes the error
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("Fail");   
                        throw;         **Error is thrown here**
                    }
                }
            }

            index = index + 1;  //Adds 1 to the index to move to the next loop
            if (index == Data.Count - 1) //***
            { loop = false; }   //Ends the loop if the Data list is filled
                }

代码从文本框( tb )获取文本值并将其添加到列表(数据),但在返回空白值时返回错误。 我已经检查 P.encrypt 方法在返回空白值时完成,并且在将字符串添加到列表时发生错误。调用列表时的索引是1,我尝试手动将列表容量设置为30,但是我仍然得到错误。

我对错误的理解是索引太高或者是负数,但是如果我手动将列表容量设置为30,那么1怎么可能太高或者负数?

2 个答案:

答案 0 :(得分:2)

此代码中有两个未命中用法。

  1. 您正在设置容量容量并不意味着当前元素数量,它意味着元素的最大数量。
  2. 列表不像数组那样。
  3. 更改Data[index] = P.encrypt(tb.Text);

    Data.Add(P.encrypt(tb.Text));

答案 1 :(得分:2)

我认为你对列表的容量有些疑惑。对于List<T>[Capacity][1]只是列表在需要调整其内部数据结构之前可以容纳的元素数。重要的是,这并不意味着列表具有 30个条目,这意味着虽然列表的大小小于30,但不需要进行任何大小调整。首次创建时,它仍将以0个条目开始。

我认为你还没有把任何东西放到列表中,所以Data[1]确实会超出范围。如果你想要30个初始化的插槽,那么你需要添加30个项目来初始化你的列表,或者使用类似于数组的东西,如果你把它的大小设置为30就会有30个项目。