Що означає виключення ArrayIndexOutOfBoundsException
і як його позбутися?
Нижче наведено приклад коду, що генерує виключення:
String[] name = { "tom", "dick", "harry" };
for (int i = 0; i <= name.length; i++) {
System.out.println(name[i]);
}
Першим пунктом призначення має бути документація, яка досить чітко це пояснює:
Генерується, щоб вказати, що до масиву було здійснено доступ з недопустимим індексом. Індекс або від'ємний, або більший чи рівний розміру масиву.
Тому, наприклад:
int[] array = new int[5];
int boom = array[10]; // Throws the exception
Щодо того, як цього уникнути... гм, не робіть цього. Будьте обережні з індексами масивів.
Однією з проблем, з якою іноді стикаються люди, є те, що вони думають, що масиви є 1-індексованими, наприклад
int[] array = new int[5];
// ... populate the array here ...
for (int index = 1; index <= array.length; index++)
{
System.out.println(array[index]);
}
Це призведе до пропуску першого елемента (індекс 0) і викличе виключення, коли індекс дорівнює 5. Допустимі індекси тут від 0 до 4 включно. Правильним, ідіоматичним оператором for
тут буде:
for (int index = 0; index < array.length; index++)
(Це, звичайно, за умови, що вам потрібен індекс. Якщо ви можете використати розширений цикл for замість цього, зробіть це).
if (index < 0 || index >= array.length) {
// Don't use this index. This is out of bounds (borders, limits, whatever).
} else {
// Yes, you can safely use this index. The index is present in the array.
Object element = array[index];
}
Оновлення: відповідно до вашого фрагменту коду,
for (int i = 0; i<=name.length; i++) {
Індекс включає довжину масиву. Це виходить за рамки. Потрібно замінити <=
на <
.
for (int i = 0; i < name.length; i++) {
Це означає, що ви намагаєтесь отримати доступ до індексу масиву, який не є допустимим, оскільки не знаходиться між межами.
Наприклад, це може ініціалізувати примітивний цілочисельний масив з верхньою межею 4.
int intArray[] = new int[5];
Програмісти рахують з нуля. Тому, наприклад, це викличе виключення ArrayIndexOutOfBoundsException
, оскільки верхньою межею є 4, а не 5.
intArray[5];