← Назад к вопросам

Что такое IndexOutOfRangeException?

1.2 Junior🔥 121 комментариев
#Основы C# и .NET

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое IndexOutOfRangeException?

IndexOutOfRangeException — это исключение (exception), возникающее в C# при попытке обращения к элементу массива или коллекции по индексу, который выходит за допустимые границы диапазона. Это одно из наиболее распространенных исключений, встречающихся в разработке на C#, и относится к типу System.IndexOutOfRangeException, являющемуся производным от System.Exception.

Основная причина возникновения

Исключение возникает, когда индекс, используемый для доступа к элементу, либо меньше 0, либо больше или равен длине массива/коллекции. В C# индексация массивов и большинства коллекций (например, List<T>) начинается с 0, а последний допустимый индекс равен Length - 1 (для массива) или Count - 1 (для списка).

Примеры ситуаций, приводящих к исключению:

int[] numbers = new int[5] { 1, 2, 3, 4, 5 };

// Попытка обратиться к индексу -1 (меньше 0)
int invalid1 = numbers[-1]; // IndexOutOfRangeException

// Попытка обратиться к индексу 5 (равно Length, последний индекс - 4)
int invalid2 = numbers[5]; // IndexOutOfRangeException

// Попытка обратиться к индексу 10 (явно больше Length)
int invalid3 = numbers[10]; // IndexOutOfRangeException

Типичные сценарии в разработке Backend

  1. Ошибки в циклах — наиболее частый случай. Например, использование неправильного условия в цикле for.
string[] items = GetItemsFromDatabase(); // Возвращает массив длины N

// Ошибка: условие i <= items.Length, а должно быть i < items.Length
for (int i = 0; i <= items.Length; i++)
{
    Process(items[i]); // При i == items.Length возникнет исключение
}
  1. Работа с вложенными массивами или многомерными массивами — ошибки в индексации по нескольким измерениям.
int[,] matrix = new int[3, 4];

// Ошибка: второй индекс должен быть от 0 до 3, здесь 4 недопустимо
int value = matrix[1, 4]; // IndexOutOfRangeException
  1. Обработка данных с неправильными предположениями о размере — например, когда код ожидает определенное количество элементов, но получает меньше (часто при обработке ответов API, чтении файлов).
string[] csvLines = ReadCsvFile();
string[] firstLineColumns = csvLines[0].Split(',');

// Ошибка: если в строке меньше 5 колонок, например, только 3
string fifthColumn = firstLineColumns[4]; // Может вызвать исключение
  1. Использование неправильных индексов при манипуляциях с коллекциями — особенно после изменений размера (удаления элементов).

Как предотвратить IndexOutOfRangeException

  • Всегда проверяйте границы индексов перед доступом. Используйте условия if (index >= 0 && index < array.Length).
  • Используйте безопасные методы доступа — например, для List<T> есть метод ElementAtOrDefault() (из LINQ), который возвращает default значение при невалидном индексе, но лучше проверять границы явно.
  • Предпочитайте циклы foreach вместо for при простом перечислении элементов — foreach автоматически управляет индексацией и исключает такие ошибки для итерируемых коллекций.
  • Внимательно работайте с многомерными массивами — проверяйте каждый индекс отдельно.
  • При работе с коллекциями, изменяющими размер (например, при удалении элементов внутри цикла) — будьте осторожны с индексами. Рассмотрите использование циклов в обратном порядке (for (int i = list.Count - 1; i >= 0; i--)) или временного списка для удалений.
  • Используйте защитное программирование — валидация входных данных, особенно при получении индексов из внешних источников (пользовательский ввод, параметры запроса).

Обработка исключения

Хотя можно использовать блок try-catch для обработки IndexOutOfRangeException, лучшей практикой является предотвращение исключения через проверку границ, как показано выше. Обработка через catch часто маскирует логические ошибки в коде.

try
{
    int value = array[index];
}
catch (IndexOutOfRangeException ex)
{
    // Логирование и возможно, возврат default значения
    Logger.LogError(ex);
    value = default;
}

Заключение

IndexOutOfRangeException — это исключение, сигнализирующее о ошибке в логике программы, чаще всего связанной с неправильным управлением индексами. Для backend-разработчика понимание и предотвращение этого исключения критически важно для создания стабильных и надежных приложений, особенно при обработке больших объемов данных, работе с массивами результатов запросов к базе данных или манипуляциях с коллекциями в многопоточных сценариях (где необходимо дополнительно синхронизировать доступ). Основной подход — проактивная проверка границ индексов и использование безопасных идиом программирования, что снижает количество ошибок и улучшает качество кода.