Was verursacht ArrayIndexOutOfBoundsException
?
Wenn Sie sich eine Variable als "Box" vorstellen, in der Sie einen Wert platzieren können, ist ein Array eine Reihe von Boxen nebeneinander, wobei die Anzahl der Boxen eine endliche und explizite Ganzzahl ist.
Erstellen eines Arrays wie folgt:
final int[] myArray = new int[5]
erstellt eine Reihe von 5 Feldern mit jeweils einem int
. Jedes der Felder hat einen Index, eine Position in der Reihe der Felder. Dieser Index beginnt bei 0 und endet bei N-1, wobei N die Größe des Arrays (die Anzahl der Felder) ist.
Um einen der Werte aus dieser Reihe von Feldern abzurufen, können Sie über seinen Index wie folgt darauf verweisen:
myArray[3]
Damit erhalten Sie den Wert der 4. Box in der Reihe (da die erste Box den Index 0 hat).
Ein ArrayIndexOutOfBoundsException
wird dadurch verursacht, dass versucht wird, eine nicht vorhandene "Box" abzurufen, indem ein Index übergeben wird, der höher als der Index der letzten "Box" oder negativ ist.
In meinem laufenden Beispiel würden diese Codefragmente eine solche Ausnahme erzeugen:
myArray[5] //tries to retrieve the 6th "box" when there is only 5
myArray[-1] //just makes no sense
myArray[1337] //waay to high
Wie vermeide ich? ArrayIndexOutOfBoundsException
Um dies zu verhindern ArrayIndexOutOfBoundsException
, sind einige wichtige Punkte zu beachten:
Looping
Stellen Sie beim Durchlaufen eines Arrays immer sicher, dass der Index, den Sie abrufen, streng kleiner ist als die Länge des Arrays (die Anzahl der Felder). Zum Beispiel:
for (int i = 0; i < myArray.length; i++) {
Beachten Sie die <
, mischen Sie nie ein =
in dort ..
Vielleicht möchten Sie versucht sein, so etwas zu tun:
for (int i = 1; i <= myArray.length; i++) {
final int someint = myArray[i - 1]
Tu es einfach nicht. Halten Sie sich an die obige (wenn Sie den Index verwenden müssen) und es erspart Ihnen viel Schmerz.
Verwenden Sie nach Möglichkeit foreach:
for (int value : myArray) {
Auf diese Weise müssen Sie überhaupt nicht an Indizes denken.
Ändern Sie beim Schleifen NIEMALS den Wert des Schleifeniterators (hier :) i
. Der einzige Ort, an dem sich der Wert ändern sollte, ist, die Schleife am Laufen zu halten. Eine andere Änderung birgt nur das Risiko einer Ausnahme und ist in den meisten Fällen nicht erforderlich.
Abrufen / Aktualisieren
Überprüfen Sie beim Abrufen eines beliebigen Elements des Arrays immer, ob es sich um einen gültigen Index für die Länge des Arrays handelt:
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];
}