Исключение: 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. Поэтому при возникновении данной ошибки, первое, что нужно сделать, так это убедиться в том, что Вы указали правильный индекс при обращении к элементу массива или обобщённой коллекции.
Так же данная ошибка очень часто встречается в циклах, особенно в цикле 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> 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); } }
Читайте также: