it-swarm.com.de

Was verursacht eine Java.lang.ArrayIndexOutOfBoundsException und wie kann ich diese verhindern?

Was bedeutet ArrayIndexOutOfBoundsException und wie kann ich es loswerden? 

Hier ist ein Codebeispiel, das die Ausnahme auslöst:

String[] name = { "tom", "dick", "harry" };
for (int i = 0; i <= name.length; i++) {
    System.out.println(name[i]);
}
240
Aaron

Ihre erste Anlaufstelle sollte die Dokumentation sein , die es verständlich erklärt:

Wird ausgelöst, um anzuzeigen, dass auf ein Array mit einem ungültigen Index zugegriffen wurde. Der Index ist entweder negativ oder größer als oder gleich der Größe des Arrays.

Also zum Beispiel:

int[] array = new int[5];
int boom = array[10]; // Throws the exception

Um es zu vermeiden ... mach das nicht. Seien Sie vorsichtig mit Ihren Array-Indizes.

Ein Problem, mit dem Leute manchmal konfrontiert werden, ist der Gedanke, dass Arrays 1-indexiert sind, z.

int[] array = new int[5];
// ... populate the array here ...
for (int index = 1; index <= array.length; index++)
{
    System.out.println(array[index]);
}

Dadurch wird das erste Element (Index 0) übersprungen und eine Ausnahme ausgelöst, wenn Index 5 ist. Die gültigen Indizes sind hier 0 bis einschließlich 4. Die richtige, idiomatische for-Anweisung wäre hier:

for (int index = 0; index < array.length; index++)

(Das setzt voraus, dass Sie brauchen den Index natürlich. Wenn Sie stattdessen die erweiterte for-Schleife verwenden können, tun Sie dies.)

247
Jon Skeet
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];
}

Siehe auch:


Update: gemäß Ihrem Code-Snippet 

for (int i = 0; i<=name.length; i++) {

Der Index enthält die Länge des Arrays. Dies ist außerhalb der Grenzen. Sie müssen <= durch < ersetzen.

for (int i = 0; i < name.length; i++) {
45
BalusC

Um es kurz auszudruecken:

In der letzten Iteration von

for (int i = 0; i <= name.length; i++) {

i ist gleich name.length, was ein unzulässiger Index ist, da Arrayindizes nullbasiert sind.

Ihr Code sollte lesen

for (int i = 0; i < name.length; i++) 
                  ^
18
aioobe

Dies bedeutet, dass Sie versuchen, auf einen Index eines Arrays zuzugreifen, der nicht gültig ist, da er sich nicht zwischen den Begrenzungen befindet.

Dies würde zum Beispiel ein ganzzahliges Array mit der oberen Grenze 4 initialisieren.

int intArray[] = new int[5];

Programmierer zählen von Null. Dies würde zum Beispiel eine ArrayIndexOutOfBoundsException werfen, da die obere Grenze 4 und nicht 5 ist.

intArray[5];
14

Was verursacht ArrayIndexOutOfBoundsException?

Wenn Sie sich eine Variable als "Feld" vorstellen, in das Sie einen Wert einfügen können, ist ein Array eine Reihe von Feldern, die nebeneinander platziert werden, wobei die Anzahl der Felder eine endliche und explizite Ganzzahl ist.

Erstellen eines Arrays wie folgt:

final int[] myArray = new int[5]

erstellt eine Reihe von 5 Boxen, die jeweils eine int enthalten. Jedes Feld hat einen Index, eine Position in der Reihe von Feldern. Dieser Index beginnt bei 0 und endet bei N-1, wobei N die Größe des Arrays (Anzahl der Felder) ist.

Um einen der Werte aus dieser Reihe von Feldern abzurufen, können Sie über seinen Index darauf verweisen, wie folgt:

myArray[3]

Damit erhalten Sie den Wert des vierten Felds in der Serie (da das erste Feld den Index 0 hat).

Eine ArrayIndexOutOfBoundsException wird dadurch verursacht, dass versucht wird, eine nicht vorhandene "Box" abzurufen, indem ein Index übergeben wird, der höher ist als der Index der letzten "Box" oder negativ.

Bei meinem laufenden Beispiel würden diese Codeausschnitte 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

So vermeiden Sie ArrayIndexOutOfBoundsException

Um ArrayIndexOutOfBoundsException zu verhindern, sind einige wichtige Punkte zu beachten:

Looping

Stellen Sie beim Durchlaufen eines Arrays immer sicher, dass der Index, den Sie abrufen, strikt kleiner ist als die Länge des Arrays (die Anzahl der Boxen). Zum Beispiel:

for (int i = 0; i < myArray.length; i++) {

Beachten Sie den <, mischen Sie niemals einen = darin.

Vielleicht möchten Sie versucht sein, so etwas zu tun:

for (int i = 1; i <= myArray.length; i++) {
    final int someint = myArray[i - 1]

Einfach nicht. Halten Sie sich an die obige (wenn Sie den Index verwenden müssen) und er wird Ihnen viel Schmerz ersparen.

Verwenden Sie nach Möglichkeit foreach:

for (int value : myArray) {

Auf diese Weise müssen Sie gar nicht an Indizes denken.

Was auch immer Sie tun, ändern Sie NIEMALS den Wert des Schleifeniterators (hier: i). Der einzige Ort, an dem dieser Wert geändert werden sollte, ist, die Schleife aufrecht zu erhalten. Andernfalls riskieren Sie eine Ausnahme und sind in den meisten Fällen nicht erforderlich.

Abrufen/Aktualisieren

Wenn Sie ein beliebiges Element des Arrays abrufen, prüfen Sie immer, ob es sich um einen gültigen Index handelt, und zwar anhand der Länge des Arrays:

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];
}
9
Tobb

Um zu vermeiden, dass der Array-Index außerhalb der zulässigen Grenzen liegt, sollten Sie die Anweisung enhanced -for verwenden, wo und wann dies möglich ist.

Die Hauptmotivation (und der Anwendungsfall) liegt vor, wenn Sie iterieren und keine komplizierten Iterationsschritte benötigen. Sie könnten not in der Lage sein, eine erweiterte -for zu verwenden, um sich in einem Array rückwärts zu bewegen oder nur bei jedem anderen Element zu iterieren.

Es ist garantiert, dass Ihnen dabei nicht die Elemente ausgehen, die durchlaufen werden können, und Ihr [korrigiertes] Beispiel lässt sich leicht konvertieren.

Der Code unten:

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i< name.length; i++) {
    System.out.print(name[i] + "\n");
}

... entspricht dem:

String[] name = {"tom", "dick", "harry"};
for(String firstName : name) {
    System.out.println(firstName + "\n");
}
9
Makoto

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 String-Objekte in Ihrem Array von String-Objekten an, d. h. 3, aber Sie können nur bis zu Index 2 name[2], zugreifen, da auf das Array von Index 0 bis name.length - 1 zugegriffen werden kann, wo name.length Anzahl der Objekte angezeigt wird.

Selbst wenn Sie eine for-Schleife verwenden, haben Sie mit Index Null begonnen und sollten mit name.length - 1 enden. In einem Array a [n] können Sie von [0] bis [n-1] zugreifen.

Zum Beispiel:

String[] a={"str1", "str2", str3" ..., "strn"};

for(int i=0;i<a.length()i++)
    System.out.println(a[i]);

In Ihrem Fall:

String[] name = {"tom", "dick", "harry"};

for(int i = 0; i<=name.length; i++) {
    System.out.print(name[i] +'\n');
}
4

Für Ihr angegebenes Array ist die Länge des Arrays 3 (d. H. Name.length = 3). Da das Element jedoch ab Index 0 abgelegt wird, hat es den Maximalindex 2.

Anstelle von "i ** <= name.length" sollten Sie "i <** name.length" schreiben, um "ArrayIndexOutOfBoundsException" zu vermeiden.

3
nIKHIL

So viel zu dieser einfachen Frage, aber ich wollte nur ein neues Feature in Java hervorheben, das alle Verwirrungen rund um das Indizieren in Arrays selbst für Anfänger vermeidet. Java-8 hat die Aufgabe, für Sie zu iterieren, abstrahiert.

int[] array = new int[5];

//If you need just the items
Arrays.stream(array).forEach(item -> { println(item); });

//If you need the index as well
IntStream.range(0, array.length).forEach(index -> { println(array[index]); })

Was ist der vorteil Eine Sache ist die Lesbarkeit wie Englisch. Zweitens brauchen Sie sich keine Sorgen um den ArrayIndexOutOfBoundsException

2
Satyendra Kumar

ArrayIndexOutOfBounds bedeutet, dass Sie versuchen, eine Position innerhalb eines Arrays zu indizieren, die nicht zugeordnet ist.

In diesem Fall:

String[] name = { "tom", "dick", "harry" };
for (int i = 0; i <= name.length; i++) {
    System.out.println(name[i]);
}
  • name.length ist 3, da das Array mit 3 String-Objekten definiert wurde.
  • Wenn auf den Inhalt eines Arrays zugegriffen wird, beginnt die Position bei 0. Da es 3 Elemente gibt, bedeutet dies Name [0] = "tom", Name [1] = "dick" und Name [2] = "harry
  • Da i kleiner oder gleich name.length sein kann, versuchen Sie beim Schleifen auf name [3] zuzugreifen, der nicht verfügbar ist.

Um das zu umgehen ...

  • In Ihrer for-Schleife können Sie i <name.length ausführen. Dies würde eine Schleife zu name [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. filtern, den Text transformieren, in eine Karte konvertieren usw. (benötigt Java8)

    String[] name = { "tom", "dick", "harry" }; --- Arrays.asList(name).stream().forEach(System.out::println); --- Stream.of(name).forEach(System.out::println);

2
martinywwan

 Array index out of bounds exception

So sieht diese Art von Ausnahme aus, wenn sie in Eclipse geworfen wird. Die rote Zahl gibt den Index an, auf den Sie zugreifen wollten. Der Code würde also so aussehen:

myArray[5]

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,

int[] intArray = new int[3];

dann sind die einzigen gültigen Indizes:

intArray[0]
intArray[1]
intArray[2]

Wenn ein Array eine Länge von 1 hat,

int[] intArray = new int[1];

dann ist der einzig gültige Index:

intArray[0]

Jede ganze Zahl, die der Länge des Arrays entspricht oder größer als diese ist: liegt außerhalb der Grenzen.

Jede ganze Zahl kleiner als 0 ist außerhalb der Grenzen.

P.S .: Wenn Sie Arrays besser verstehen und praktische Übungen machen möchten, finden Sie hier ein Video: Tutorial zu Arrays in Java

2
Ion

Sie erhalten ArrayIndexOutOfBoundsException aufgrund des i<=name.length-Teils. name.length gibt die Länge der Zeichenfolge name zurück. Dies ist 3. Wenn Sie also versuchen, auf name[3] zuzugreifen, ist dies illegal und löst eine Ausnahme aus.

Behobener Code:

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i < name.length; i++) { //use < insteadof <=
  System.out.print(name[i] +'\n');
}

Es ist in der Java-Sprachspezifikation definiert :

Das public final-Feld length, das die Anzahl der Komponenten enthält des Arrays. length kann positiv oder null sein.

2
roottraveller

ArrayIndexOutOfBoundsException Wenn diese Ausnahme auftritt, bedeutet dies, dass Sie versuchen, einen Index eines Arrays zu verwenden, der außerhalb seiner Grenzen liegt.

Um dies zu verhindern, stellen Sie immer sicher, dass Sie keinen Index anfordern, der nicht im Array vorhanden ist. Wenn die Arraylänge 10 ist, muss Ihr Index zwischen 0 und 9 liegen

1
sgrpwr

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 um eins kürzer als die Länge des Arrays.

1

Nach Ihrem Code:

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i<=name.length; i++) {
  System.out.print(name[i] +'\n');
}

Wenn Sie System.out.print (name.length) überprüfen;

du erhältst 3;

das heißt, Ihre Namenslänge ist 3

ihre Schleife läuft von 0 bis 3, was entweder "0 bis 2" oder "1 bis 3" sein sollte

Antworten

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i<name.length; i++) {
  System.out.print(name[i] +'\n');
}
1

Der häufigste Fall, den ich für scheinbar mysteriöse ArrayIndexOutOfBoundsExceptions gesehen habe, d. H. Anscheinend nicht durch eigenen Code zur Array-Verarbeitung verursacht wurde, ist die gleichzeitige Verwendung von SimpleDateFormat. Insbesondere in einem Servlet oder Controller:

public class MyController {
  SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");

  public void handleRequest(ServletRequest req, ServletResponse res) {
    Date date = dateFormat.parse(req.getParameter("date"));
  }
}

Wenn zwei Threads die SimplateDateFormat.parse () -Methode gemeinsam eingeben, wird wahrscheinlich eine ArrayIndexOutOfBoundsException angezeigt. Beachten Sie den Synchronisationsabschnitt des class-Javadoc für SimpleDateFormat .

Stellen Sie sicher, dass sich in Ihrem Code keine Stelle befindet, die auf unsichere Klassen wie SimpleDateFormat auf gleichzeitige Weise wie in einem Servlet oder Controller zugreift. Überprüfen Sie alle Instanzvariablen Ihrer Servlets und Controller auf wahrscheinliche Verdächtige.

1
Kyri Sarantakos

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:

int [][][] a  = new int [2][3][4];

for(int i = 0; i < a.length; i++){
    for(int j = 0; j < a[i].length; j++){
        for(int k = 0; k < a[j].length; k++){
            System.out.print(a[i][j][k]);
        }
        System.out.println();
    }
    System.out.println();
}

Jede Dimension hat eine andere Länge, daher besteht der subtile Fehler darin, dass die mittlere und innere Schleife die length-Eigenschaft derselben Dimension verwenden (weil a[i].length mit a[j].length identisch ist).

Stattdessen sollte die innere Schleife a[i][j].length (oder a[0][0].length, der Einfachheit halber) verwenden.

1
Bill the Lizard

ArrayIndexOutOfBoundsException bedeutet, dass Sie versuchen, auf einen Index des Arrays zuzugreifen, der nicht existiert oder außerhalb der Grenzen dieses Arrays liegt. Array-Indizes beginnen mit 0 und enden bei length - 1

In Ihrem Fall 

for(int i = 0; i<=name.length; i++) {
    System.out.print(name[i] +'\n'); // i goes from 0 to length, Not correct
}

Die Variable ArrayIndexOutOfBoundsException tritt auf, wenn Sie versuchen, auf das indizierte Element name.length zuzugreifen. Das Ersetzen von <= durch <würde dieses Problem lösen. 

for(int i = 0; i < name.length; i++) {
    System.out.print(name[i] +'\n');  // i goes from 0 to length - 1, Correct
}
0
adn.911

Jedes Element in einem Array wird als Element bezeichnet, und auf jedes Element wird über seinen numerischen Index zugegriffen. Wie in der vorherigen Abbildung gezeigt, beginnt die Nummerierung mit 0 . Auf das 9. Element würde daher beispielsweise an Index 8 zugegriffen.

IndexOutOfBoundsException wird ausgelöst, um anzuzeigen, dass ein Index (z. B. für ein Array, einen String oder einen Vektor) außerhalb des gültigen Bereichs liegt.

Auf jedes Array X kann von [0 bis (X.length - 1)] zugegriffen werden.

0
ZiadM

ArrayIndexOutOfBoundsException name selbst erklärt, dass eine solche Ausnahme auftritt, wenn Sie versuchen, auf den Wert am Index zuzugreifen, der außerhalb des Bereichs der Arraygröße liegt.

In Ihrem Fall können Sie einfach das Gleichheitszeichen aus Ihrer for-Schleife entfernen.

for(int i = 0; i<name.length; i++)

Die bessere Option besteht darin, ein Array zu iterieren:

for(String i : name )
      System.out.println(i);
0

Dieser Fehler tritt bei Überschreitungszeiten der Laufschleife auf. Betrachten wir ein einfaches Beispiel wie das folgende:

class demo{
  public static void main(String a[]){

    int[] numberArray={4,8,2,3,89,5};

    int i;

    for(i=0;i<numberArray.length;i++){
        System.out.print(numberArray[i+1]+"  ");
    }
}

Zuerst habe ich ein Array als 'numberArray' initialisiert. Anschließend werden einige Array-Elemente mit der for-Schleife gedruckt. Wenn die Schleife 'i' läuft, drucken Sie das Element (numberArray [i + 1]. (Wenn i den Wert 1 hat, wird das Element numberArray [i + 1] gedruckt.) Nehmen wir an, wenn i = (numberArray). Länge-2), letztes Element des Arrays wird gedruckt. Wenn der 'i'-Wert auf (numberArray.length-1) wechselt, wird kein Wert zum Drucken ausgegeben idee. danke!

0
GT_hash

Für jedes Array der Länge n haben die Elemente des Arrays einen Index von 0 bis n-1.

Wenn Ihr Programm versucht, auf ein Element (oder einen Speicher) zuzugreifen, dessen Arrayindex größer als n-1 ist, gibt Java ArrayIndexOutOfBoundsException aus.

Hier sind zwei Lösungen, die wir in einem Programm verwenden können

  1. Anzahl halten:

    for(int count = 0; count < array.length; count++) {
        System.out.println(array[count]);
    }
    

    Oder eine andere Schleife wie

    int count = 0;
    while(count < array.length) {
        System.out.println(array[count]);
        count++;
    }
    
  2. Ein besserer Weg mit einer für jede Schleife. Bei dieser Methode muss sich ein Programmierer nicht um die Anzahl der Elemente im Array kümmern.

    for(String str : array) {
        System.out.println(str);
    }
    
0
Mohit

Ich sehe hier alle Antworten, die erklären, wie mit Arrays gearbeitet wird und wie der Index außerhalb der Grenzen zu vermeiden ist. Ich vermeide persönlich Arrays um jeden Preis. Ich verwende die Collections-Klassen, die alle Dummheiten vermeiden, mit Array-Indizes vollständig umgehen zu müssen. Die Schleifenkonstrukte funktionieren hervorragend mit Sammlungen, die Code unterstützen, der sowohl einfacher zu schreiben als auch zu verstehen und zu warten ist.

0