Что такое ArrayIndexOutOfBoundsException, почему возникает и как исправить?

Исключение 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]}
Хотя такой код работает так, как предполагается, подобная практика считается очень плохой. Привыкнуть к нумерации с нуля -- не сложно. Отступление от общепринятых подходов чревато неожиданными ошибками.