Was ArrayIndexOutOfBoundsException
bedeutet und wie werde ich es los?
Hier ist ein Codebeispiel, das die Ausnahme auslöst:
String[] names = { "tom", "bob", "harry" };
for (int i = 0; i <= names.length; i++) {
System.out.println(names[i]);
}
Was ArrayIndexOutOfBoundsException
bedeutet und wie werde ich es los?
Hier ist ein Codebeispiel, das die Ausnahme auslöst:
String[] names = { "tom", "bob", "harry" };
for (int i = 0; i <= names.length; i++) {
System.out.println(names[i]);
}
i <= name.length
durchi < name.length
- oder schreiben Sie eine erweiterte for-Schleife. (for (String aName : name) { ... }
)Antworten:
Ihre erste Anlaufstelle sollte die Dokumentation sein, die dies einigermaßen klar erklärt:
Also zum Beispiel:
Wie man es vermeidet ... ähm, tu das nicht. Seien Sie vorsichtig mit Ihren Array-Indizes.
Ein Problem, auf das Menschen manchmal stoßen, ist der Gedanke, dass Arrays 1-indiziert sind, z
Dadurch wird das erste Element (Index 0) übersehen und eine Ausnahme ausgelöst, wenn der Index 5 ist. Die gültigen Indizes hier sind 0-4 einschließlich. Die richtige, idiomatische
for
Aussage hier wäre:( Dies setzt natürlich voraus, dass Sie den Index benötigen . Wenn Sie stattdessen die erweiterte for-Schleife verwenden können, tun Sie dies.)
quelle
for (int nestedIndex = 0; nestedIndex < array[outerIndex].length; nestedIndex++) { ... array[outerIndex][nestedIndex] ... }
.Siehe auch:
Update : gemäß Ihrem Code-Snippet,
Der Index enthält die Länge des Arrays. Dies ist außerhalb der Grenzen. Sie müssen ersetzen
<=
durch<
.quelle
Aus diesem ausgezeichneten Artikel: ArrayIndexOutOfBoundsException in for-Schleife
Um es kurz auszudruecken:
In der letzten Iteration von
i
wird gleich,name.length
was ein unzulässiger Index ist, da Array-Indizes auf Null basieren.Ihr Code sollte lauten
quelle
Dies bedeutet, dass Sie versuchen, auf einen Index eines Arrays zuzugreifen, der nicht gültig ist, da er nicht zwischen den Grenzen liegt.
Dies würde beispielsweise ein primitives ganzzahliges Array mit der Obergrenze 4 initialisieren.
Programmierer zählen von Null. So würde dies zum Beispiel ein werfen,
ArrayIndexOutOfBoundsException
da die Obergrenze 4 und nicht 5 ist.quelle
Um eine Ausnahme außerhalb der Grenzen des Array-Index zu vermeiden, sollte die erweiterte
for
Anweisung verwendet werden, wo und wann dies möglich ist.Die Hauptmotivation (und der Anwendungsfall) besteht darin, dass Sie iterieren und keine komplizierten Iterationsschritte benötigen. Sie können ein erweitertes Element nicht verwenden
for
, um sich in einem Array rückwärts zu bewegen oder nur jedes andere Element zu iterieren.Dabei gehen Ihnen garantiert nicht die Elemente aus, über die Sie iterieren können, und Ihr [korrigiertes] Beispiel kann problemlos konvertiert werden.
Der folgende Code:
... ist gleichbedeutend damit:
quelle
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:
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:
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:
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:
Beachten Sie die
<
, mischen Sie nie ein=
in dort ..Vielleicht möchten Sie versucht sein, so etwas zu tun:
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:
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:
quelle
In Ihrem Code haben Sie auf die Elemente vom Index 0 bis zur Länge des String-Arrays zugegriffen.
name.length
Gibt die Anzahl der Zeichenfolgenobjekte in Ihrem Array von Zeichenfolgenobjekten an, dh 3, Sie können jedoch nur auf Index 2 zugreifenname[2]
, da auf das Array von Index 0 bis zu der Stelle zugegriffen werden kann,name.length - 1
an der Sie diename.length
Anzahl der Objekte erhalten.Selbst wenn Sie eine
for
Schleife verwenden, haben Sie mit dem Index Null begonnen und sollten mit endenname.length - 1
. In einem Array a [n] können Sie von a [0] auf a [n-1] zugreifen.Zum Beispiel:
In deinem Fall:
quelle
Für Ihr angegebenes Array beträgt die Länge des Arrays 3 (dh name.length = 3). Da es jedoch Elemente ab Index 0 speichert, hat es den maximalen Index 2.
Anstelle von 'i ** <= name.length' sollten Sie also 'i <** name.length' schreiben, um ' ArrayIndexOutOfBoundsException' zu vermeiden.
quelle
Soviel zu dieser einfachen Frage, aber ich wollte nur eine neue Funktion in Java hervorheben, die selbst für Anfänger alle Verwirrungen bei der Indizierung in Arrays vermeidet. Java-8 hat die Aufgabe des Iterierens für Sie abstrahiert.
Was ist der Vorteil? Nun, eine Sache ist die Lesbarkeit wie Englisch. Zweitens brauchen Sie sich keine Sorgen zu machen
ArrayIndexOutOfBoundsException
quelle
Sie bekommen
ArrayIndexOutOfBoundsException
wegeni<=name.length
Teil.name.length
Geben Sie die Länge der Zeichenfolge zurückname
, die 3 ist. Wenn Sie also versuchen, darauf zuzugreifenname[3]
, ist dies unzulässig und löst eine Ausnahme aus.Aufgelöster Code:
Es ist in der Java-Sprachspezifikation definiert :
quelle
So sieht diese Art von Ausnahme aus, wenn sie in Eclipse ausgelöst wird. Die rote Zahl kennzeichnet den Index, auf den Sie zugreifen wollten. Der Code würde also so aussehen:
Der Fehler wird ausgelöst, wenn Sie versuchen, auf einen Index zuzugreifen, der in diesem Array nicht vorhanden ist. Wenn ein Array eine Länge von 3 hat,
dann sind die einzigen gültigen Indizes:
Wenn ein Array eine Länge von 1 hat,
dann ist der einzig gültige Index:
Jede Ganzzahl, die der Länge des Arrays entspricht oder größer als diese ist, ist außerhalb der Grenzen.
Jede Ganzzahl kleiner als 0: ist außerhalb der Grenzen;
PS: Wenn Sie Arrays besser verstehen und einige praktische Übungen machen möchten, finden Sie hier ein Video: Tutorial zu Arrays in Java
quelle
Bei mehrdimensionalen Arrays kann es schwierig sein, sicherzustellen, dass Sie auf die
length
Eigenschaft der richtigen Dimension zugreifen . Nehmen Sie zum Beispiel den folgenden Code:Jede Dimension hat eine andere Länge, daher besteht der subtile Fehler darin, dass die mittlere und die innere Schleife die
length
Eigenschaft derselben Dimension verwenden (weila[i].length
dieselbe wiea[j].length
).Stattdessen sollte die innere Schleife verwendet werden
a[i][j].length
(oder dera[0][0].length
Einfachheit halber).quelle
Der häufigste Fall, den ich für scheinbar mysteriöse ArrayIndexOutOfBoundsExceptions gesehen habe, dh anscheinend nicht durch Ihren eigenen Code für die Array-Behandlung verursacht wurde, ist die gleichzeitige Verwendung von SimpleDateFormat. Insbesondere in einem Servlet oder Controller:
Wenn zwei Threads zusammen die SimplateDateFormat.parse () -Methode eingeben, wird wahrscheinlich eine ArrayIndexOutOfBoundsException angezeigt. Beachten Sie den Synchronisationsabschnitt der Klasse javadoc für SimpleDateFormat .
Stellen Sie sicher, dass in Ihrem Code kein Platz vorhanden ist, der gleichzeitig auf unsichere Thread-Klassen wie SimpleDateFormat zugreift, wie in einem Servlet oder Controller. Überprüfen Sie alle Instanzvariablen Ihrer Servlets und Controller auf mögliche Verdächtige.
quelle
ArrayIndexOutOfBoundsException Wenn diese Ausnahme auftritt, bedeutet dies, dass Sie versuchen, einen Index des Arrays zu verwenden, der außerhalb seiner Grenzen liegt, oder in Laienbegriffen mehr anfordern, als Sie initialisiert haben.
Um dies zu verhindern, stellen Sie immer sicher, dass Sie keinen Index anfordern, der nicht im Array vorhanden ist. Wenn die Array-Länge 10 beträgt, muss Ihr Index zwischen 0 und 9 liegen
quelle
ArrayIndexOutOfBounds bedeutet, dass Sie versuchen, eine Position innerhalb eines nicht zugewiesenen Arrays zu indizieren.
In diesem Fall:
Um dies zu umgehen ...
In Ihrer for-Schleife können Sie i <name.length ausführen. Dies würde eine Schleife zum Namen [3] verhindern und stattdessen bei Name [2] anhalten.
for(int i = 0; i<name.length; i++)
Verwenden Sie für jede Schleife ein
String[] name = { "tom", "dick", "harry" }; for(String n : name) { System.out.println(n); }
Verwenden Sie list.forEach (Consumer-Aktion) (erfordert Java8)
String[] name = { "tom", "dick", "harry" }; Arrays.asList(name).forEach(System.out::println);
Array in Stream konvertieren - Dies ist eine gute Option, wenn Sie zusätzliche 'Operationen' für Ihr Array ausführen möchten, z. B. filtern, den Text transformieren, in eine Karte konvertieren usw. (erfordert Java8).
String[] name = { "tom", "dick", "harry" }; --- Arrays.asList(name).stream().forEach(System.out::println); --- Stream.of(name).forEach(System.out::println);
quelle
ArrayIndexOutOfBoundsException
bedeutet, dass Sie versuchen, auf einen Index des Arrays zuzugreifen, der nicht vorhanden ist oder außerhalb der Grenzen dieses Arrays liegt. Array-Indizes beginnen bei 0 und enden bei der Länge - 1 .In deinem Fall
ArrayIndexOutOfBoundsException
tritt auf, wenn Sie versuchen, auf das nicht vorhandene indizierte Element name.length zuzugreifen (Array-Index endet mit der Länge -1). Nur <= durch <zu ersetzen, würde dieses Problem lösen.quelle
Für jedes Array der Länge n haben Elemente des Arrays einen Index von 0 bis n-1.
Wenn Ihr Programm versucht, auf ein Element (oder einen Speicher) mit einem Array-Index größer als n-1 zuzugreifen , löst Java eine ArrayIndexOutOfBoundsException aus
Hier sind zwei Lösungen, die wir in einem Programm verwenden können
Anzahl beibehalten:
Oder eine andere Schleifenanweisung wie
Ein besserer Weg mit a für jede Schleife, bei dieser Methode muss sich ein Programmierer nicht um die Anzahl der Elemente im Array kümmern.
quelle
Gemäß Ihrem Code:
Wenn Sie System.out.print (name.length) überprüfen;
du wirst 3 bekommen;
Das bedeutet, dass Ihre Namenslänge 3 beträgt
Ihre Schleife läuft von 0 bis 3, wobei entweder "0 bis 2" oder "1 bis 3" ausgeführt werden sollte.
Antworten
quelle
Jedes Element in einem Array wird als Element bezeichnet, und auf jedes Element wird über seinen numerischen Index zugegriffen. Wie in der vorhergehenden Abbildung gezeigt, beginnt die Nummerierung mit 0 . Auf das 9. Element würde daher beispielsweise bei Index 8 zugegriffen.
IndexOutOfBoundsException wird ausgelöst, um anzuzeigen, dass ein Index (z. B. für ein Array, eine Zeichenfolge oder einen Vektor) außerhalb des Bereichs liegt.
Auf jedes Array X kann von [0 bis (X. Länge - 1)] zugegriffen werden.
quelle
Ich sehe hier alle Antworten, die erklären, wie man mit Arrays arbeitet und wie man den Index außerhalb der Grenzen vermeidet. Ich persönlich vermeide Arrays um jeden Preis. Ich verwende die Collections-Klassen, wodurch die Dummheit vermieden wird, sich vollständig mit Array-Indizes befassen zu müssen. Die Schleifenkonstrukte funktionieren hervorragend mit Sammlungen, die Code unterstützen, der sowohl einfacher zu schreiben, zu verstehen als auch zu warten ist.
quelle
Wenn Sie die Länge eines Arrays verwenden, um die Iteration einer for- Schleife zu steuern , denken Sie immer daran, dass der Index des ersten Elements in einem Array 0 ist . Der Index des letzten Elements in einem Array ist also eins weniger als die Länge des Arrays.
quelle
ArrayIndexOutOfBoundsException
Der Name selbst erklärt, dass eine solche Ausnahme auftritt, wenn Sie versuchen, auf den Wert am Index zuzugreifen, der außerhalb des Bereichs der Array-Größe liegt.In Ihrem Fall können Sie einfach das Gleichheitszeichen aus Ihrer for-Schleife entfernen.
Die bessere Option besteht darin, ein Array zu iterieren:
quelle
Dieser Fehler tritt bei Laufbegrenzungsüberschreitungszeiten auf. Betrachten wir ein einfaches Beispiel wie dieses:
Zuerst habe ich ein Array als 'numberArray' initialisiert. Anschließend werden einige Array-Elemente mit der for-Schleife gedruckt. Wenn die Schleife die Zeit 'i' ausführt, drucken Sie das Element (numberArray [i + 1]. (Wenn der i-Wert 1 ist, wird das Element numberArray [i + 1] gedruckt.). Angenommen, wenn i = (numberArray). Länge-2), das letzte Element des Arrays wird gedruckt. Wenn der Wert 'i' auf (numberArray.length-1) geht, wird kein Wert zum Drucken ausgegeben. In diesem Punkt tritt 'ArrayIndexOutOfBoundsException' auf. Ich hoffe, Sie könnten es bekommen Idee. Danke!
quelle
Sie können optionale Verwendung in funktionalem Stil zu vermeiden ,
NullPointerException
undArrayIndexOutOfBoundsException
:Ausgabe:
quelle
Sie konnten nicht mehr Daten als die Länge Ihres Arrays iterieren oder speichern. In diesem Fall könnten Sie Folgendes tun:
Oder dieses:
quelle