Исключение java.lang.ArrayIndexOutOfBoundsException выбрасывается Java-машиной, когда код пытается получить доступ к элементы массива, используя для этого некорректный индекс: отрицательное число или число, превышающее максимальный индекс массива.
Основные причины
Ключевая сложность, возникающая при переборе элементов массива, заключается в том, что индексы массива считаются с нуля, а не с единицы. В теории это довольно простое и понятное правило, но при написании цикла for то и дело возникают сложности с тем, как учесть этот фактор при переборе элементов. Рассмотрим пример. Если у нас создан такой массив: int[] nums = new int[3]; то нам доступны всего три элемента: nums[0], nums[1] и nums[2] Видно, что индекс последнего элемента на единицу меньше размера массива. Это и тот факт, что индекс начинается с нуля, должно быть учтено при создании цикла for для перебора элементов массива: int[] nums = new int[3]; for (int i = 0; i < nums.lenght; i++ { System.out.println(nums[i]);} nums.lenght вернёт 3, поэтому, если написать i <= nums.lenght (меньше или равно) вместо просто меньше, то на последней итерации будет запрошен такой элемент: nums[3]. Но максимальный индекс: nums[2]. Значит мы запросим элемент за пределами массива и машина выбросит ArrayIndexOutOfBoundsException. Ещё один способ получит данное исключение заключается в том, чтобы запросить элемент с отрицательным индексом: int[] nums = new int[3];System.out.println(nums[-1]); Такая ситуация возможна, если мы будем перебирать элементы массива от старших индексов к младшим и неверно рассчитаем количество итераций.
Плохая практика
У начинающих программистов может возникнуть идея считать индексы от единицы до длины массива (от 1 до 3, в нашем примере), а при обращении к элементу просто вычитать единицу: int[] nums = new int[3]; for (int i = 1; i <= nums.length; i++) { int element = nums[i - 1]} Хотя такой код работает так, как предполагается, подобная практика считается очень плохой. Привыкнуть к нумерации с нуля -- не сложно. Отступление от общепринятых подходов чревато неожиданными ошибками.