Почему возникает исключение: Index was out of range?

Исключение: Index was out of range

Очень часто при работе с массивами или коллекциями можно столкнуться с исключением: Index was out of range. В чём заключается суть ошибки.

Представьте, что у Вас есть массив, состоящий из двух элементов, например:

int [] ar = new int [] {5,7};

Особенность массивов в языке c# заключается в том, что начальный индекс элемента всегда равен нулю. То есть в данном примере, не смотря на то, что число пять — это первое значение элемента массива, при обращении к нему потребуется указать индекс ноль. Так же и для числа семь, несмотря на то, что это число является вторым элементом массива, его индекс так же будет на единицу меньше, то есть, равен одному.

5 7
0 1

Обращение к элементам массива:

int a = ar[0];
int b = ar[1];

Результат: a = 5 и b = 7.

Но, стоит только указать неверный индекс, например:

int a = ar[2];

В результате получаем исключение: Index was outside the bounds of the array, то есть индекс находиться за границами диапазона, который в данном примере составляет от 0 до 1. Поэтому при возникновении данной ошибки, первое, что нужно сделать, так это убедиться в том, что Вы указали правильный индекс при обращении к элементу массива или обобщённой коллекции.

Exception

Так же данная ошибка очень часто встречается в циклах, особенно в цикле for, если Вы указываете неверное количество элементов содержащихся в массиве, например:

List<int> ar = new List<int> {8,9};
for (int i = 0; i < 3; i++)
{
int a = ar[i];
};

В результате так же возникает ArgumentOutOfRangeException, так как количество элементов равно двум, а не трём. Поэтому лучше всего в циклах использовать уже готовые методы для подсчёта количества элементов массива или коллекций, например:

для массива

for (int i = 0; i < ar.Length; i++)
{
int a = ar[i];
};

для коллекции

List<int&gt; ar = new List<int> {5,7};
for (int i = 0; i < ar.Count; i++)
{
int a = ar[i];
}

Говоря про циклы нельзя не упомянуть ещё одну ошибку, которая очень часто встречается у многих начинающих программистов. Представим, что у нас есть две коллекции и нам нужно заполнить список var2 значениями из первого списка.

List<string> var = new List<string> {"c#", "visual basic", "c++"};
List<string> var2 = new List<string> {};
for (int i = 0; i < var.Count; i++)
{
var2[i] = var[i].ToString();
}

Не смотря на то, что вроде бы все указано, верно, в результате выполнения кода, уже на самом первом шаге цикла, будет выдано исключение: Index was out of range. Это связано с тем, что для заполнения коллекции var2 требуется использовать не индекс, а метод Add.

for (int i = 0; i < var.Count; i++)
{
var2.Add(var[i].ToString());
}

Если же Вы хотите отловить данное исключение, в ходе выполнения программы, то для этого достаточно воспользоваться блоками try catch, например:

try
{
for (int i = 0; i < var.Count; i++)
{
var2[i] = var[i].ToString();
}
}
catch (ArgumentOutOfRangeException e)
{
Console.WriteLine(e.Message);
}
}

Читайте также:

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *