System.IndexOutOfRangeException - Index 在数组边界之外

本文关键字:边界 数组 IndexOutOfRangeException Index System | 更新日期: 2023-09-27 18:32:05

我正在创建一个程序,该程序从Excel工作表导入信息的2d对象数组。然后,它将此数组传递给要处理的 ProcessObjects 方法,并将其打印/导出回 excel 模板。谁能告诉我为什么我会收到此错误消息?

"项目中发生了类型为'System.IndexOutOfRangeException'的未处理异常.exe

其他信息:索引超出数组的范围。

private void ProcessObjects(object[,] classesArray, object[,] classesAvailabilityArray, Excel.Workbook workbook2, Excel.Sheets excelSheets)
{
    // once classes are selected, they are copied to a temporary location
    // while they're waiting to be printed
    object[,] tempArray = new object[6,3];
    // This stops the while loop once enough credit hours have been taken 
    // It must reach 123 hours for CS Degree .
    int hourCounter = 0;
    int iteration = 0;
    while (hourCounter < 123)
        {
            // this while loop copies some classes from classesArray to tempArray
            // so they can be printed into the excel template (NewStudentTemplateCS.xlsx)
            //
            int classes = 0, hours = 0; // stops while loop if limit is reached
            int w = 0, x = 0; // used to select individual elements of tempArray (0 based)
                              // w = row
                              // x = column
            int y = 1, z = 1; // used to select individual elements of classesArray (1 based)
                              // y = row
                              // z = column
            while(classes < 7 || hours < 17)
            {
                // this loop checks the status of the flag and stops at the first avaliable
                // class/row of classesArray
                while (classesArray[y,7] == (object)1)
                {
                    y++;
                }
                // copies the call EX: "MATH 2313" from classesArray to tempArray
                tempArray[w,x] = classesArray[y,z];
                x += 2;
                z += 2;
                // copies the name EX: "Calculus I" from classesArray to tempArray
                tempArray[w, x] = classesArray[y, z];
                x++;
                z++;
                // Copies the hours EX: "3" from classesArray to tempArray
                tempArray[w, x] = classesArray[y, z];
                Console.WriteLine("debug test");
                // increments classes, hours, and hourCounter for exit decision
                classes += 1;
                hours += (int)classesArray[y, z];
                hourCounter += (int)classesArray[y, z];
                // sets flag to one
                z += 3;
                classesArray[y, z] = 1;
            }// end while loop
            // print method that prints temp array and clears tempArray for next use
            PrintArray(tempArray, iteration, workbook2, excelSheets);
            // iterates iteration
            iteration++;
        } // end while loop
        // print method that prints temp array and clears tempArray for next use
        PrintArray(tempArray, iteration, workbook2, excelSheets);
        // iterates iteration
        iteration++;
    } // end while loop
} // end ProcessObjects method

我已经单独注释掉了以下每一行,但每一行代码都返回了我上面列出的相同错误。

Console.WriteLine("debug test");
// increments classes, hours, and hourCounter for exit decision
classes += 1;
hours += (int)classesArray[y, z];
hourCounter += (int)classesArray[y, z];
// sets flag to one
z += 3;
classesArray[y, z] = 1;

System.IndexOutOfRangeException - Index 在数组边界之外

在调试器中单步执行代码:

object[,] tempArray = new object[6,3];

您正在创建一个最大索引为 tempArray[5, 2] 的数组。然后你开始循环。在每个循环开始时:

int w = 0, x = 0;

然后在循环的主体中:

tempArray[w,x] = classesArray[y,z];

您分配给tempArray[0, 0]

x += 2;
z += 2;
tempArray[w, x] = classesArray[y, z];

您分配给tempArray[0, 2]

x++;
z++;
// Copies the hours EX: "3" from classesArray to tempArray
tempArray[w, x] = classesArray[y, z];

您分配给tempArray[0, 3] .但tempArray的最大索引是 [0, 2];您的数组索引超出了范围,这正是异常告诉您的。

如果你能确定yz永远不会超出classesArray的范围,你可以这样声明tempArray

object[,] tempArray = new object[classesArray.GetLength(0), classesArray.GetLength(1)];

但是对于所有这些硬编码的幻数,并试图用不同的基数同步数组,这是非常危险的代码。

您使用的整数(即 w,x,y,z)变得大于定义的数组大小。您应该在代码中添加断点,以便可以看到编译期间发生的情况,并查看断点在何处变得比数组定义预期的要大。

循环的规则通常用于阻止索引越界异常的发生。我建议稍微分解一下代码,似乎有很多事情要做,但对于这个循环来说似乎太多了。