2017-06-21 2 views
2

Wenn wir ein Dummy-ArrayList wie unten erstellen und get Methode mit -1 und 1 als Argument nennen. Dann erhalten wir die folgende output:ArrayIndexOutOfBoundException vs IndexOutOfBoundException

  • Für Testfall 1: Es wirft ArrayIndexOutOfBoundException

  • Für Testfall 2: Es wirft IndexOutOfBoundException.

    List list = new ArrayList(); 
    list.get(-1); //Test Case 1 
    list.get(1); // Test Case 2 
    

Bitte erklären, warum es die Differenz zwischen diesen beiden ist?

+0

Ein sofort offensichtlicher Unterschied ist, dass "-1" niemals ein gültiger Index sein wird, während "1" (wenn eine Liste mindestens zwei Einträge hat). –

+0

* ArrayIndexOutOfBoundException * ist eine Unterklasse von ** IndexOutOfBoundException ** - der wichtigste Punkt. Die andere Unterklasse ist * StringIndexOutOfBoundsException *. –

Antwort

6

Dies ist ein Implementierungsdetail von ArrayList.

ArrayList wird von einem Array unterstützt. Ein Zugriff auf ein Array mit einem negativen Index wirft ArrayIndexOutOfBoundsException, so dass es nicht explizit durch den Code ArrayList Klasse getestet werden muss.

Auf der anderen Seite, wenn Sie Zugriff auf die ArrayList mit einem nicht-negativen Index, der außerhalb des Bereichs der ist ArrayList (dh> = die Größe der ArrayList), eine spezifische Kontrolle in dem folgende Verfahren durchgeführt wird, die IndexOutOfBoundsException wirft:

/** 
* Checks if the given index is in range. If not, throws an appropriate 
* runtime exception. This method does *not* check if the index is 
* negative: It is always used immediately prior to an array access, 
* which throws an ArrayIndexOutOfBoundsException if index is negative. 
*/ 
private void rangeCheck(int index) { 
    if (index >= size) 
     throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); 
} 

Diese Prüfung notwendig ist, da der zugeführte Index ein gültiger Index der Trägeranordnung sein kann (wenn sie kleiner als die aktuelle Kapazität des ArrayList ist), so dass mit einem Index der Träger Array zugreift> = die Größe ArrayList wird nicht unbedingt eine Ausnahme auslösen.

ArrayIndexOutOfBoundsException ist eine Unterklasse von IndexOutOfBoundsException, was bedeutet, es richtig ArrayList ‚s zu sagen ist get Methode IndexOutOfBoundsException für beide negative Indizes wirft und Indizes> = die Größe der Liste.

Beachten Sie, dass im Gegensatz zu ArrayList, LinkedList wirft IndexOutOfBoundsException für sowohl negativen als auch nicht-negativen Indizes, da sie nicht von einem Array unterstützt wird, so dass es nicht auf einem Array verlassen kann eine Ausnahme für negative Indizes zu werfen:

private void checkElementIndex(int index) { 
    if (!isElementIndex(index)) 
     throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); 
} 

/** 
* Tells if the argument is the index of an existing element. 
*/ 
private boolean isElementIndex(int index) { 
    return index >= 0 && index < size; 
} 
+0

@ Eran - Sir Java Dokumente sagt, wenn Index kleiner als 0 oder größer oder gleich der Größe der Liste ist, wird es IndexOutOfBoundException thorw. –

+2

@Animal Der Javadoc sagt die Wahrheit, da 'ArrayIndexOutOfBoundsException' eine Unterklasse von 'IndexOutOfBoundException' ist. – Eran

+0

Ohhhh ... Awesome hat es dank ... :) –

Verwandte Themen