我正在创建一个从excel表导入2d对象信息数组的程序。然后它将此数组传递给ProcessObjects方法进行处理并打印/导出回excel模板。任何人都可以告诉我为什么我收到此错误消息?
“Project.exe中发生了'System.IndexOutOfRangeException'类型的未处理异常
附加信息:索引超出了数组的范围。“
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;
答案 0 :(得分:3)
在调试器中逐步执行代码:
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];你的数组索引超出范围,正是异常告诉你的。
如果您确定y
和z
永远不会超出classesArray
的范围,您可以像这样声明tempArray
:
object[,] tempArray = new object[classesArray.GetLength(0), classesArray.GetLength(1)];
但是对于所有这些硬编码的幻数,并试图同步具有不同基数的数组,这是非常危险的代码。
答案 1 :(得分:1)
您正在使用的整数(即w,x,y,z)变得大于定义的数组大小。您应该在代码中添加断点,以便您可以看到编译期间发生的情况,并查看它们变得比数组定义所预期的更大。
循环规则通常用于阻止索引超出范围的异常。我建议稍微分解一下代码,似乎有很多东西在继续,但对于这个循环似乎太过分了。