Co jest przyczyną ArrayIndexOutOfBoundsException
?
Jeśli myślisz o zmiennej jako „polu”, w którym możesz umieścić wartość, to tablica to seria pól umieszczonych obok siebie, gdzie liczba pól jest skończoną i jawną liczbą całkowitą.
Tworzenie takiej tablicy:
final int[] myArray = new int[5]
tworzy rząd 5 pól, każde z nich zawiera int
. Każde z pól ma indeks, pozycję w szeregu pól. Indeks zaczyna się od 0, a kończy na N-1, gdzie N jest rozmiarem tablicy (liczba pól).
Aby pobrać jedną z wartości z tej serii pól, możesz odwołać się do niej poprzez jej indeks, jak poniżej:
myArray[3]
Który da ci wartość czwartego pola w serii (ponieważ pierwsze pole ma indeks 0).
Na ArrayIndexOutOfBoundsException
to spowodowane próbą odzyskania „nieistniejącego” pola, przekazaniem indeksu wyższego niż indeks ostatniego „pola” lub ujemnego.
W moim działającym przykładzie te fragmenty kodu spowodowałyby taki wyjątek:
myArray[5] //tries to retrieve the 6th "box" when there is only 5
myArray[-1] //just makes no sense
myArray[1337] //waay to high
Jak ominąć ArrayIndexOutOfBoundsException
Aby temu zapobiec ArrayIndexOutOfBoundsException
, należy wziąć pod uwagę kilka kluczowych punktów:
Pętla
Przechodząc przez tablicę, zawsze upewnij się, że indeks, który pobierasz, jest ściśle mniejszy niż długość tablicy (liczba pól). Na przykład:
for (int i = 0; i < myArray.length; i++) {
Zauważ, że <
nigdy =
tam nie mieszaj …
Możesz mieć ochotę zrobić coś takiego:
for (int i = 1; i <= myArray.length; i++) {
final int someint = myArray[i - 1]
Po prostu nie. Trzymaj się powyższego (jeśli musisz użyć indeksu), a zaoszczędzi ci to dużo bólu.
Gdzie to możliwe, użyj foreach:
for (int value : myArray) {
W ten sposób nie będziesz musiał w ogóle myśleć o indeksach.
Podczas wykonywania pętli, cokolwiek robisz, NIGDY nie zmieniaj wartości iteratora pętli (tutaj: i
. Jedynym miejscem, w którym powinna to zmienić wartość, jest utrzymanie pętli. Zmiana go w inny sposób ryzykuje wyjątek i w większości przypadków nie jest konieczna.
Pobieranie / aktualizacja
Podczas pobierania dowolnego elementu tablicy zawsze sprawdzaj, czy jest to prawidłowy indeks względem długości tablicy:
public Integer getArrayElement(final int index) {
if (index < 0 || index >= myArray.length) {
return null; //although I would much prefer an actual exception being thrown when this happens.
}
return myArray[index];
}