Was ist eine IndexOutOfRangeException / ArgumentOutOfRangeException und wie behebe ich es?
Ich habe einige code und, wenn es ausgeführt wird, es wirft ein IndexOutOfRangeException
sagen,
Index war außerhalb der Begrenzungen des Arrays.
Was bedeutet das und was kann ich dagegen tun?
Je nach Klassen benutzt, kann es auch sein ArgumentOutOfRangeException
Eine Ausnahme des Typs " System.ArgumentOutOfRangeException' ist in mscorlib.dll wurde aber nicht behandelt werden, in Benutzer-code Zusätzliche Informationen: der Index war außerhalb des Bereichs. Muss nicht negativ und kleiner als die Größe der Sammlung.
InformationsquelleAutor Adriano Repetti | 2014-01-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Ist Es?
Diese Ausnahme bedeutet, dass Sie versuchen, Zugriff auf eine Sammlung Artikel, die durch den index, mit einem ungültigen index. Ein index ungültig ist, wenn es niedriger ist als die Sammlung der Untergrenze oder größer als oder gleich der Anzahl von Elementen, die es enthält.
, Wenn Es Geworfen Wird
Gegeben ein array deklariert als:
Können Sie Zugriff auf das array von 0 bis 3, Werte außerhalb dieses Bereichs verursachen
IndexOutOfRangeException
geworfen werden. Beachten Sie dies, wenn Sie die Erstellung und den Zugriff auf ein array.Array-Länge
In C#, normalerweise sind arrays 0-basiert. Es bedeutet, das erste element hat den index 0 und das Letzte element hat den index
Length - 1
(woLength
ist die Gesamtzahl der Elemente im array), so dass dieser code nicht funktioniert:Außerdem bitte beachten Sie, dass wenn Sie ein mehrdimensionales array, dann können Sie nicht verwenden
Array.Length
für beide dimension, die Sie haben zu verwendenArray.GetLength()
:Obergrenze Ist Nicht Inklusive
Im folgenden Beispiel erstellen wir eine raw-zweidimensionales array von
Color
. Jedes Objekt repräsentiert einen pixel, die Indizes sind aus(0, 0)
zu(imageWidth - 1, imageHeight - 1)
.Dieser code wird dann fehlschlagen, da der array ist 0-basiert und auf der letzten (unten rechts), pixel im Bild
pixels[imageWidth - 1, imageHeight - 1]
:In einem anderen Szenario können Sie bekommen
ArgumentOutOfRangeException
für diesen code (zum Beispiel, wenn Sie mitGetPixel
Methode auf eineBitmap
Klasse).Arrays Wachsen Nicht
Ein array ist schnell. Sehr schnell in der linearen Suche im Vergleich zu jeder anderen Sammlung. Es ist, weil die Elemente im Speicher zusammenhängend sind, so Speicheradresse berechnet werden kann (und das Inkrement ist nur eine Ergänzung). Keine Notwendigkeit zu Folgen, eine Liste von Knoten, einfache Mathematik! Sie bezahlen dies mit einer Einschränkung: Sie können nicht wachsen, wenn Sie mehr Elemente, die Sie brauchen, um umzuverteilen, dass array (möglicherweise expansiv, wenn alte Elemente kopiert werden müssen, um einen neuen block). Ändern Sie die Größe von Ihnen mit
Array.Resize<T>()
diesem Beispiel fügt einen neuen Eintrag zu einem vorhandenen array:Vergessen Sie nicht, dass gültige Indizes sind aus
0
zuLength - 1
. Wenn Sie einfach versuchen, ordnen Sie ein Element anLength
erhalten SieIndexOutOfRangeException
(dieses Verhalten kann verwechseln Sie wenn Sie denken, Sie können erhöhen Sie mit einer syntax ähnlichInsert
Methode von anderen Sammlungen).Besondere Arrays Mit Benutzerdefinierten Untere Schranke
Erste Element in arrays hat immer den index 0. Dies ist nicht immer wahr, denn Sie können erstellen Sie ein array mit einer benutzerdefinierten untere Schranke:
In diesem Beispiel werden array-Indizes sind gültig von 1 bis 4. Natürlich Obere Schranke kann nicht geändert werden.
Falsche Argumente
Wenn Sie den Zugriff auf ein array mit ungeprüften Argumenten (aus Benutzereingaben oder aus der Funktion, Benutzer) Sie können diese Fehlermeldung erhalten:
Unerwartete Ergebnisse
Diese Ausnahme kann geworfen werden aus einem anderen Grund zu: per Konvention viele Suchfunktionen wird -1 zurück (nullables wurde eingeführt .NET 2.0 und sowieso ist es auch eine bekannte Konvention von vielen Jahren), wenn Sie nicht alles finden. Stellen Sie sich vor, Sie haben ein array von Objekten vergleichbar mit einem string. Sie denken vielleicht, dies zu schreiben-code:
Diese fehl, wenn keine Elemente in der
myArray
befriedigen Suche, Zustand, weilArray.IndexOf()
wird -1 zurück und dann array-Zugriff werfen.Nächste Beispiel ist ein naives Beispiel zur Berechnung der vorkommen eines gegebenen Satzes von zahlen (zu wissen, die maximale Anzahl und die Rückgabe eines array, in dem Element an index 0 steht die Anzahl 0, werden Elemente mit index 1 steht die Nummer 1 und so weiter):
Natürlich ist es eine ziemlich schreckliche Umsetzung aber, was ich zeigen will ist, dass es dann nicht für negative zahlen und zahlen über
maximum
., Wie es gilt für
List<T>
?Gleichen Fällen wie bei array - Bereichs der gültigen Indizes - 0 (
List
's-Indizes beginnen immer mit 0) zulist.Count
- Zugriff auf Elemente außerhalb dieses Bereichs verursachen die Ausnahme.Beachten Sie, dass
List<T>
wirftArgumentOutOfRangeException
für die gleichen Fälle, in denen arrays verwendenIndexOutOfRangeException
.Im Gegensatz zu arrays,
List<T>
beginnt leer - so versucht, den Zugriff auf Elemente des soeben erstellten Liste führen zu dieser Ausnahme.Häufiger der Fall ist, zum füllen der Liste mit Indexierung (ähnlich
Dictionary<int, T>
) verursachen Ausnahme:IDataReader und Spalten
Stellen Sie sich vor Sie versuchen das Lesen von Daten aus einer Datenbank mit diesem code:
GetString()
werfenIndexOutOfRangeException
weil Sie dataset hat nur zwei Spalten, sondern Sie versuchen, einen Wert von 3. eine (Indizes sind immer 0-basiert).Bitte beachten Sie, dass dieses Verhalten gemeinsam mit den meisten
IDataReader
Implementierungen (SqlDataReader
,OleDbDataReader
und so weiter).Können Sie die gleiche Ausnahme auch, wenn Sie das IDataReader überlastung der indexer-operator, der nimmt den Namen einer Spalte aus, und übergeben Sie eine ungültige Spalte name.
Angenommen zum Beispiel, dass Sie abgerufen haben eine Spalte mit dem Namen Column1 aber dann Sie versuchen, um den Wert des Feldes mit
Dies geschieht, weil der indexer-operator implementiert wird, ist beim abrufen der index einer Colum1 Bereich, der nicht existiert. Die Methode GetOrdinal löst diese Ausnahme aus, wenn der interne helper-code gibt eine -1 als index der "Colum1".
Andere
Es ist eine weitere (dokumentierte) Fall, wenn diese Ausnahme wird geworfen: wenn in
DataView
-, Daten-Spalte-name wird angegeben, um dieDataViewSort
Eigenschaft ist nicht gültig.Wie zu Vermeiden
In diesem Beispiele lassen mich vermuten, der Einfachheit halber, dass arrays sind immer eindimensional und 0-basiert. Wenn Sie wollen, konsequent zu sein (oder bist du in der Entwicklung einer Bibliothek), müssen Sie möglicherweise zu ersetzen
0
mitGetLowerBound(0)
und.Length
mitGetUpperBound(0)
(natürlich, wenn Sie die Parameter des TypsSystem.Arra
y, es gilt nicht fürT[]
). Bitte beachten Sie, dass in diesem Fall der oberen Grenze ist inklusive dann dieser code:Sollte wie folgt umgeschrieben werden:
Bitte beachten Sie, dass dies nicht erlaubt ist (es werfe
InvalidCastException
), das ist, warum, wenn Ihre Parameter sindT[]
du bist sicher über benutzerdefinierte untere Grenze von arrays:Validierung Der Parameter
Wenn der index kommt von einem parameter sollte man immer überprüfen kann (wirft geeignete
ArgumentException
oderArgumentOutOfRangeException
). Im nächsten Beispiel falsche Parameter verursachenIndexOutOfRangeException
Benutzer diese Funktion erwarten kann, diese, weil Sie ein array übergeben, aber es ist nicht immer so offensichtlich. Ich würde vorschlagen, immer zu überprüfen Parameter für öffentliche Funktionen:Wenn-Funktion ist privat, können Sie Sie einfach ersetzen
if
Logik mitDebug.Assert()
:Überprüfen Sie Den Status Des Objektes
Array-index kann nicht direkt von einem parameter. Es kann Teil eines Objektes. Im Allgemeinen ist immer eine gute Praxis, um überprüfen den Status des Objektes (durch sich selbst und mit der Funktion Parameter, falls erforderlich). Sie können
Debug.Assert()
, werfen Sie eine richtige Ausnahme (mehr beschreibende Informationen über das problem) oder zu behandeln, dass wie in diesem Beispiel:Überprüfen Rückgabewerte
In einem der vorherigen Beispiele, die wir direkt verwendet werden
Array.IndexOf()
Rückgabewert. Wenn wir wissen, dass es schief gehen könnte, dann ist es besser zu behandeln diesen Fall:Wie Debug
Meiner Meinung nach die meisten Fragen, die hier SO über diesen Fehler lassen sich einfach vermeiden. Zeit, die Sie verbringen, um zu schreiben, eine richtige Frage (mit einem kleinen Beispiel und eine kleine Erklärung) könnte leicht viel mehr als die Zeit, die Sie brauchen, um den code Debuggen. Zunächst Lesen Sie in diesem Eric Lippert ' s blog-post über debugging von kleinen Programmen, ich werde nicht wiederholen, seine Worte hier, aber es ist absolut ein Lesen muss.
Source-code exception mit stack-trace. Es gehen, wählen rechts line-Nummer, und Sie werden sehen:
Finden Sie Ihre Fehler, prüfen Sie, wie
index
erhöht. Ist es richtig? Prüfen Sie, wie array zugeordnet ist, ist im Einklang mit, wieindex
erhöht? Ist es richtig nach deiner Angabe? Wenn Sie die Antwort ja auf alle diese Fragen, dann finden Sie gute Hilfe hier auf StackOverflow, aber prüfen Sie bitte zunächst für sich selbst. Sie sparen Ihre eigene Zeit!Einen guten Startpunkt ist immer mit Behauptungen und zur Validierung der Eingaben. Sie möchten vielleicht sogar, um die Verwendung von code contracts. Wenn etwas schief ging und Sie nicht herausfinden können, was passiert mit einem schnellen Blick auf deinen code, dann haben Sie zum resort zu einem alten Freund: debugger. Nur führen Sie Ihre Anwendung im debug in Visual Studio (oder Ihre Lieblings-IDE), sehen Sie genau, welche Linie wirft diese Ausnahme, die array beteiligt ist, und dem index, den Sie versuchen zu verwenden. Wirklich, 99% der Zeiten, die Sie lösen es, indem Sie sich in wenigen Minuten.
Falls dies passiert in der Produktion, dann würden Sie besser zum hinzufügen von Behauptungen, die in der Beschuldigten-code, wahrscheinlich werden wir nicht sehen im code, was du nicht selbst sehen (aber Sie können immer Wetten).
InformationsquelleAutor
Einfache Erklärung darüber, was ein Index out of bound exception is:
Denken Sie nur einem Zug ist es seine Fächer sind D1,D2,D3.
Ein Passagier kam zu geben die Bahn und er haben das ticket für die D4.
nun, was passieren wird. der Passagier möchten, geben Sie ein Fach, das nicht vorhanden ist, so offensichtlich problem entstehen wird.
Gleiche Szenario: sobald wir versuchen, Zugriff auf eine array-Liste, etc. wir können nur auf den bestehenden Indizes im array.
array[0]
undarray[1]
vorhanden sind. Wenn wir versuchen, aufarray[3]
, es ist es tatsächlich so, dass ein index out of bound exception auftreten.InformationsquelleAutor Lijo
Leicht zu verstehen, das problem ist, vorstellen, dass wir diesen code schrieb:
Ergebnis:
Größe des Arrays ist 3 (die Indizes 0, 1 und 2), aber die for-Schleife Schleifen 4-mal (0, 1, 2 und 3).
So, wenn es versucht, Zugriff außerhalb der Grenzen mit (3) Sie wirft die Ausnahme.
InformationsquelleAutor Snr
Einen Seite von der sehr lange, vollständig akzeptierte Antwort gibt es einen wichtigen Punkt zu machen über
IndexOutOfRangeException
im Vergleich mit vielen anderen exception-Typen, und das ist:Oft gibt es eine komplexe Zustand des Programms, das vielleicht schwierig zu kontrollieren an einem bestimmten Punkt im code.e.g eine DB-Verbindung zusammenbricht, so dass die Daten für eine Eingabe nicht abgerufen werden können etc... Diese Art von Problem führt oft zu einer Ausnahme von einer Art, die hat zu sprudeln, auf eine höhere Ebene, da, wo es geschieht, hat keinen Umgang mit ihm an diesem Punkt.
IndexOutOfRangeException
ist in der Regel anders, dass es in den meisten Fällen ist es ziemlich trivial zu prüfen, an der Stelle, wo die Ausnahme ausgelöst wird. Normalerweise ist diese Art von exception geworfen bekommen, indem Sie einige code, der könnte sehr leicht mit der Frage befassen, an den Platz an dem es stattfindet - einfach durch die überprüfung der tatsächlichen Länge des Arrays. Sie wollen nicht zu "beheben" dieses durch die Behandlung dieses Ausnahme-höher - sondern durch die Gewährleistung seiner nicht geworfen in der ersten Instanz - die in den meisten Fällen wird einfach durch die überprüfung der array-Länge.Andere Weise, dies auszudrücken, ist, dass andere Ausnahmen auftreten können aufgrund echter Mangel an Kontrolle über die Eingabe oder das Programm Stand ABER
IndexOutOfRangeException
mehr als oft nicht, ist einfach nur pilot (Programmierer) Fehler.InformationsquelleAutor Ricibob