【问题标题】:IndexOutOfRangeException ?索引超出范围异常?
【发布时间】:2011-03-16 06:18:29
【问题描述】:

在以下代码中,我收到了超出范围的异常。

private void btnRoll_Click(object sender, EventArgs e)
    {
        int success4 = 0;
        int success6 = 0;
        int success8 = 0;
        int success10 = 0;
        int success20 = 0;
        int botch4 = 0;
        int botch6 = 0;
        int botch8 = 0;
        int botch10 = 0;
        int botch20 = 0;

        if (cbnd4.SelectedIndex != 0)
        {

            int value = 4;
            int arraySize = (int)cbnd4.SelectedIndex;
            int[] refArray = randomNumber(value, arraySize);
            foreach (int i in refArray)
            {

                if (cbGame.SelectedIndex == 1)
                {
                    if (refArray[i] >= 2)
                    {
                        success4++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch4++;
                    }
                }
                if (cbGame.SelectedIndex == 2)
                {
                    if(refArray[i] >= 2)
                    {
                        success4++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch4++;
                    }
                }


            }
        }
           /* if (cbmd4.SelectedIndex != 0)
            {
            }
            */
         if (cbnd6.SelectedIndex != 0)
        {
            int value = 6;
            int arrySize = (int)cbnd6.SelectedIndex;
            int[] refArray = randomNumber(value, arrySize);
            foreach (int i in refArray)
            {


                if (cbGame.SelectedIndex == 1)
                {
                    if (refArray[i] >= 4)
                    {
                        success6++;
                    } if (refArray[i] == 1)
                    {
                        botch6++;
                    }
                }
                if (cbGame.SelectedIndex == 2)
                {
                    if (refArray[i] >= 4)
                    {
                        success6++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch6++;
                    }
                }


            }
        }
        if (cbnd8.SelectedIndex != 0)
        {
            int value = 8;
            int arrySize = (int)cbnd8.SelectedIndex;
            int[] refArray = randomNumber(value, arrySize);
            foreach (int i in refArray)
            {

                if (cbGame.SelectedIndex == 1)
                {
                    if (refArray[i] >= 5)
                    {
                        success4++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch8++;
                    }
                }
                if (cbGame.SelectedIndex == 2)
                {
                    if (refArray[i] >= 5)
                    {
                        success4++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch8++;
                    }
                }


            }
        }
        if (cbnd10.SelectedIndex != 0)
        {
            int value = 10;
            int arrySize = (int)cbnd10.SelectedIndex;
            int[] refArray = randomNumber(value, arrySize);
            foreach (int i in refArray)
            {

                if (cbGame.SelectedIndex == 1)
                {
                    if (refArray[i] >= 7)
                    {
                        success10++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch10++;
                    }
                }
                if (cbGame.SelectedIndex == 2)
                {
                    if (refArray[i] >= 7)
                    {
                        success10++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch10++;
                    }
                }


            }
        }
        if (cbnd20.SelectedIndex != 0)
        {
            int value = 20;
            int arrySize = (int)cbnd20.SelectedIndex;
            int[] refArray = randomNumber(value, arrySize);
            foreach (int i in refArray)
            {

                if (cbGame.SelectedIndex == 1)
                {
                    if (refArray[i] >= 16)
                    {
                        success20++;
                    }
                    if (refArray[i] == 1)
                    {
                    botch20++;
                    }
                }
                if (cbGame.SelectedIndex == 2)
                {
                    if (refArray[i] >= 7)
                    {
                        success20++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch20++;
                    }
                }


            }
        }
        lBotch_Result.Text = Convert.ToString(botch4 + botch6 + botch8 + botch10 + botch20);
        lSuccess_Result.Text = Convert.ToString(success4 + success6 + success8 + success10 + success20);
        MessageBox.Show("d4 successes: " +
            success4.ToString() +
            "\r\nd6 Successes: " +
            success6.ToString() +
            "\r\nd8 Successes: " +
            success8.ToString() +
            "\r\nd10 Successes: " +
            success10.ToString() +
            "\r\nd20 Successes: " +
            success20.ToString() +
            "\r\nd4 Botches: " +
            botch4.ToString() +
            "\r\nd6 Botches: " +
            botch6.ToString() +
            "\r\nd8 Botches: " +
            botch8.ToString() +
            "\r\nd10 Botches: " +
            botch10.ToString() +
            "\r\nd20 Botches: " +
            botch20.ToString());

}

当 if(refArray[i] >= 7) 并且 refArray.Length 包含一个奇数 int 值时,会发生 Out of ranged 异常。

这里是异常输出:

System.IndexOutOfRangeException 是 未处理
Message="IndexOutOfRangeException"
堆栈跟踪: 在 Table_Top_Game_Dice.Form1.btnRoll_Click(对象 发件人,EventArgs e) 在 System.Windows.Forms.Control.OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnClick(EventArgs e) 在 System.Windows.Forms.ButtonBase.WnProc(WM wm, Int32 wParam, Int32 lParam) 在 System.Windows.Forms.Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam) 在 Microsoft.AGL.Forms.EVL.EnterMainLoop(IntPtr hwnMain) 在 System.Windows.Forms.Application.Run(窗体 调频) 在 Table_Top_Game_Dice.Program.Main()

这里的任何建议将不胜感激。为了解决这个问题,我已经把头撞在墙上 5 个小时了。

哦,refArray 从以下函数中获取值:(如果有帮助)

private int[] randomNumber(int value, int arraySize)
    {
        int[] randArray = new int[arraySize];
        maxValue = value;
        Random rand = new Random();
        for (int i = 0; i < arraySize; i++)
        {
           randArray[i] = rand.Next(minValue, maxValue);
        }
        return randArray;
    }

【问题讨论】:

  • 这是您可以提供的产生错误的最小代码块吗?
  • 那是一些丑陋的代码......必须有更好的方法来做你正在做的任何事情。 minValue 是在哪里定义的?
  • 最小的代码块?是的,因为它是产生错误的唯一代码块,抱歉。 :-) 丑陋的代码,绝对真理!由于这个应用程序仍处于开发的早期阶段,我预计代码会很丑陋。但是由于这个应用程序是今天早些时候才启动的,所以清理代码仍然很麻烦......

标签: c#


【解决方案1】:

我没有发现错误,但是您重复了很多代码。尝试将所有这些代码封装在一个函数中的每个“if (cbndXX.SelectedIndex != YY) 中。

类似这样的:

private void RefactorizedFunction(ComboBox cmb, ComboBox cbGame, ref int success, ref int botch, int value, int maxsuxcess)
{
    var arraySize = (int)cmb.SelectedIndex;
    int[] refArray = randomNumber(value, arraySize);

    foreach (int i in refArray)    //WARNING HERE...
    {

                if (cbGame.SelectedIndex == 1)
                {
                    if (refArray[i] >= maxsuxcess)
                    {
                        success++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch++;
                    }
                }
                if (cbGame.SelectedIndex != 2) continue;
                if (refArray[i] >= maxsuxcess)
                {
                    success++;
                }
                if (refArray[i] == 1)
                {
                    botch++;
                }
            }
    }

它没有经过测试,它不会解决你的问题,但我相信你的代码会更容易调试。还有其他方法可以改进您的代码,例如使用字典或数组来代替所有这些successXX 和 botchXX 变量,但是......一步一步来。

【讨论】:

    【解决方案2】:

    您显然是在尝试访问超出数组末尾的数组元素。

    randomNumber()方法生成一个随机数数组,其中数组的大小和最大值是独立的。因此,如果使用arraySize 3 和value 20 调用,它可能会返回{ 1, 7, 13 }

    然后您使用foreach (int i in refArray) 遍历数组。结果将有 3 次迭代,i 设置为 1,然后是 7,最后是 13。

    因此,如果您使用 refArray[i] 访问数组,您会尝试访问数组元素和索引 1、7 和 13,因此在第二次迭代中会得到 IndexOutOfRangeException,因为您尝试访问索引 7 处的元素,而该数组仅包含 3 个元素。

    您是否打算使用for (int i = 0; i &lt; refArray.Length; i++) 而不是foreach 循环?

    【讨论】:

    • 非常感谢您的输入,因为这给了我一个新的方向来进行数组迭代。对于如何遍历数组值,您有什么建议的替代方法吗?
    • 我无法从代码中看出您实际上想要做什么。我的猜测是您在我的回答的最后一句中提到了 for 循环。但是,如果您真的打算遍历数组中的元素,我不知道。也许你可以解释一下代码应该做什么。
    • 掷骰子 - 在用户界面上有几个组合框供用户选择掷什么骰子和掷多少个。随机数生成器创建一个长度为 x 的数组,其中 x 是用户选择的骰子数,maxValue 参数根据骰子的面数传递。然后将得到的数组与预定的成功值以及预定的 Botch(史诗失败)值进行比较。然后计算成功或故障的数量并显示在消息框中。遍历数组值以进行比较。感谢您及时回复
    • 那么我的猜测似乎是正确的 - 将 foreach (int i in refArray) 替换为 for (int i = 0; i &lt; refArray.Length; i++)
    • 我打算使用 msdn.microsoft.com/en-us/library/aa287602(VS.71).aspx 中描述的 foreach 循环,尽管我已经学会了永远不要相信 msdn 上的每一点信息。因此我在这里问这个问题的原因。再次感谢您的回复
    【解决方案3】:

    难道这段代码不能产生一个等于数组大小的 int 并随后在通过 i 从数组中读取该项目时导致超出范围的异常。

    int[] refArray = randomNumber(value, arraySize);
                foreach (int i in refArray)
                {
    
                    if (cbGame.SelectedIndex == 1)
                    {
                        if (refArray[i] >= 2)
                        {
                            success4++;
                        }
                        if (refArray[i] == 1)
                        {
                            botch4++;
                        }
                    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多