System.IndexOutOfRangeException - индекс находился за пределами массива
Я создаю программу, которая импортирует массив двумерных объектов информации из листа Excel. Затем он передает этот массив в метод ProcessObjects для обработки и печати / экспорта обратно в шаблон Excel. Может кто-нибудь сказать мне, почему я получаю это сообщение об ошибке?
"Произошло необработанное исключение типа" System.IndexOutOfRangeException "в Project.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;
2 ответа
Шаг через ваш код в отладчике:
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)];
Но со всеми этими жестко закодированными магическими числами и попыткой синхронизировать массивы с разными базами, это очень рискованный код.
Целые числа, которые вы используете (т. Е. W,x,y,z), становятся больше, чем определенный размер массива. Вы должны добавить точки останова в код, чтобы вы могли видеть, что происходит во время компиляции, и видеть, где они становятся больше, чем ожидали определения массива.
Правила вашего цикла, как правило, используются для остановки индекса за пределами исключений. Я бы посоветовал немного разбить код, кажется, что много чего происходит, но это слишком много для этого цикла.