ArrayIndexOutOfBoundsException — выход за границы массива
Ошибка значит, что программа обратилась к элементу массива с номером, которого в массиве нет. Индексы массива длины n — от 0 до n - 1; всё остальное, в том числе отрицательные номера, — за границей.
public class Main {
public static void main(String[] args) {
int[] a = {10, 20, 30, 40, 50};
for (int i = 0; i <= a.length; i++) {
System.out.println(a[i]);
}
}
}Программа выведет пять чисел и упадёт:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
at Main.main(Main.java:5)Сообщение говорит всё нужное: обращались к индексу 5, а длина массива 5 — последний индекс 4. Строка Main.java:5 — где это случилось.
Исправление
В условии цикла — строго меньше:
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}А если индекс не нужен, цикл for-each за границу не выйдет вовсе:
for (int x : a) {
System.out.println(x);
}Частые причины
<=вместо<в условии цикла — самая частая.- Нумерация с единицы. Последний элемент —
a[a.length - 1], а неa[a.length]. - Соседний элемент. В цикле со сравнением
a[i]иa[i + 1]счётчик должен идти доa.length - 1:for (int i = 0; i < a.length - 1; i++). - Пустой массив. У массива длины 0 нет даже
a[0]:Index 0 out of bounds for length 0. Проверяйтеa.length > 0. args[0]без аргументов. Массивargsвmainпуст, если программу запустили без аргументов командной строки. Проверьтеargs.length, прежде чем братьargs[0].- Размер меньше нужного. Массив создан как
new int[n], а записывают в негоn + 1значение.
Похожие ошибки
IndexOutOfBoundsException— то же у спискаArrayList:list.get(3), когда в списке три элемента. Размер списка —list.size().StringIndexOutOfBoundsException— у строки:s.charAt(s.length())илиs.substring(2, 10), когда в строке меньше 10 символов. Длина строки —s.length().
Подводные камни
- Не перехватывайте эту ошибку через
try/catch, чтобы «программа не падала»: это почти всегда ошибка в логике, и её надо исправить в условии цикла или в размере массива. - Отрицательный индекс тоже даёт эту ошибку: например,
a[i - 1]приi = 0.