Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

IndexOutOfRangeException-Klasse

 

Veröffentlicht: Oktober 2016

Die Ausnahme, die bei einem Versuch ausgelöst wird, auf ein Element eines Arrays oder einer Auflistung mit einem Index zuzugreifen, der sich außerhalb der Begrenzungen des Arrays oder der Auflistung befindet.

Namespace:   System
Assembly:  mscorlib (in mscorlib.dll)

System.Object
  System.Exception
    System.SystemException
      System.IndexOutOfRangeException

[SerializableAttribute]
[ComVisibleAttribute(true)]
public sealed class IndexOutOfRangeException : SystemException

NameBeschreibung
System_CAPS_pubmethodIndexOutOfRangeException()

Initialisiert eine neue Instanz der IndexOutOfRangeException-Klasse.

System_CAPS_pubmethodIndexOutOfRangeException(String)

Initialisiert eine neue Instanz der IndexOutOfRangeException-Klasse mit einer angegebenen Fehlermeldung.

System_CAPS_pubmethodIndexOutOfRangeException(String, Exception)

Initialisiert eine neue Instanz der IndexOutOfRangeException-Klasse mit einer angegebenen Fehlermeldung und einem Verweis auf die innere Ausnahme, die diese Ausnahme ausgelöst hat.

NameBeschreibung
System_CAPS_pubpropertyData

Ruft eine Auflistung von Schlüssel-Wert-Paaren ab, die zusätzliche benutzerdefinierte Informationen über die Ausnahme bereitstellen.(Geerbt von „Exception“.)

System_CAPS_pubpropertyHelpLink

Ruft einen Link zur Hilfedatei ab, die dieser Ausnahme zugeordnet ist, oder legt einen Link fest.(Geerbt von „Exception“.)

System_CAPS_pubpropertyHResult

Ruft HRESULT ab oder legt HRESULT fest. Dies ist ein codierter Wert, der einer bestimmten Ausnahme zugeordnet ist.(Geerbt von „Exception“.)

System_CAPS_pubpropertyInnerException

Ruft die Exception-Instanz ab, die die aktuelle Ausnahme verursacht hat.(Geerbt von „Exception“.)

System_CAPS_pubpropertyMessage

Ruft eine Meldung ab, die die aktuelle Ausnahme beschreibt.(Geerbt von „Exception“.)

System_CAPS_pubpropertySource

Gibt den Namen der Anwendung oder des Objekts zurück, die bzw. das den Fehler verursacht hat, oder legt diesen fest.(Geerbt von „Exception“.)

System_CAPS_pubpropertyStackTrace

Ruft eine Zeichenfolgendarstellung der unmittelbaren Frames in der Aufrufliste ab.(Geerbt von „Exception“.)

System_CAPS_pubpropertyTargetSite

Ruft die Methode ab, die die aktuelle Ausnahme auslöst.(Geerbt von „Exception“.)

NameBeschreibung
System_CAPS_pubmethodEquals(Object)

Bestimmt, ob das angegebene Objekt mit dem aktuellen Objekt identisch ist.(Geerbt von „Object“.)

System_CAPS_pubmethodGetBaseException()

Gibt beim Überschreiben in einer abgeleiteten Klasse eine Exception zurück, die die ursprüngliche Ursache für eine oder mehrere nachfolgende Ausnahmen ist.(Geerbt von „Exception“.)

System_CAPS_pubmethodGetHashCode()

Fungiert als die Standardhashfunktion.(Geerbt von „Object“.)

System_CAPS_pubmethodGetObjectData(SerializationInfo, StreamingContext)

Legt beim Überschreiben in einer abgeleiteten Klasse die SerializationInfo mit Informationen über die Ausnahme fest.(Geerbt von „Exception“.)

System_CAPS_pubmethodGetType()

Ruft den Laufzeittyp der aktuellen Instanz ab.(Geerbt von „Exception“.)

System_CAPS_pubmethodToString()

Erstellt eine Zeichenfolgendarstellung der aktuellen Ausnahme und gibt diese zurück.(Geerbt von „Exception“.)

Ein IndexOutOfRangeException Ausnahme wird ausgelöst, wenn ein ungültiger Index verwendet wird, Zugriff auf einen Member eines Arrays oder einer Auflistung oder das Lesen und Schreiben von einem bestimmten Speicherort in einem Puffer. Diese Ausnahme erbt von der Exception -Klasse fügt jedoch keine speziellen Elemente.

In der Regel eine IndexOutOfRangeException Ausnahme aufgrund Entwickler Fehler. Statt die Ausnahme behandelt, sollten Sie die Ursache des Fehlers ermitteln und beheben Sie den Code. Die häufigsten Ursachen des Fehlers sind:

  • Kleiner als die Anzahl von Elementen oder Elemente, wie im folgenden Beispiel veranschaulicht, vergessen, dass die obere Grenze einer Auflistung oder ein nullbasiertes Array wird.

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          List<Char> characters = new List<Char>();
          characters.InsertRange(0, new Char[] { 'a', 'b', 'c', 'd', 'e', 'f' } );
          for (int ctr = 0; ctr <= characters.Count; ctr++)
             Console.Write("'{0}'    ", characters[ctr]);
       }
    }
    // The example displays the following output:
    //    'a'    'b'    'c'    'd'    'e'    'f'
    //    Unhandled Exception: 
    //    System.ArgumentOutOfRangeException: 
    //    Index was out of range. Must be non-negative and less than the size of the collection.
    //    Parameter name: index
    //       at Example.Main()
    

    Um den Fehler zu beheben, können Sie Code wie den folgenden verwenden.

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          List<Char> characters = new List<Char>();
          characters.InsertRange(0, new Char[] { 'a', 'b', 'c', 'd', 'e', 'f' } );
          for (int ctr = 0; ctr < characters.Count; ctr++)
             Console.Write("'{0}'    ", characters[ctr]);
       }
    }
    // The example displays the following output:
    //        'a'    'b'    'c'    'd'    'e'    'f'
    

    Anstatt alle Elemente im Array nach dem Index durchlaufen, Sie können auch mithilfe der (in c#) oder (in Visual Basic).

  • Beim Versuch, ein anderes Array, wurde nicht wurde ausreichend dimensioniert und weniger Elemente als das ursprüngliche Array hat, ein Arrayelement zuweisen. Im folgenden Beispiel wird versucht, weisen Sie das letzte Element in der value1 auf das gleiche Element im Array der value2 Array. Allerdings die value2 Array wurde nicht ordnungsgemäß dimensioniert um sechs anstelle von sieben Elemente haben. Daher löst aus, die Zuweisung einer IndexOutOfRangeException Ausnahme.

    public class Example
    {
       public static void Main()
       {
          int[] values1 = { 3, 6, 9, 12, 15, 18, 21 };
          int[] values2 = new int[6];
    
          // Assign last element of the array to the new array.
          values2[values1.Length - 1] = values1[values1.Length - 1];
       }
    }
    // The example displays the following output:
    //       Unhandled Exception: 
    //       System.IndexOutOfRangeException: 
    //       Index was outside the bounds of the array.
    //       at Example.Main()
    
  • Mit einem Wert zurückgegeben von einen Search-Methode, einen Teil eines Arrays oder einer Auflistung beginnend an einer bestimmten Indexposition durchlaufen. Wenn Sie vergessen, überprüfen Sie, ob der Suchvorgang eine Übereinstimmung gefunden wird, löst die Laufzeit eine IndexOutOfRangeException Ausnahme, wie im folgenden Beispiel gezeigt.

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       static List<int> numbers = new List<int>();
    
       public static void Main()
       {
          int startValue; 
          string[] args = Environment.GetCommandLineArgs();
          if (args.Length < 2) 
             startValue = 2;
          else 
             if (! Int32.TryParse(args[1], out startValue))
                startValue = 2;
    
          ShowValues(startValue);
       }
    
       private static void ShowValues(int startValue)
       {   
          // Create a collection with numeric values.
          if (numbers.Count == 0)  
             numbers.AddRange( new int[] { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22} );
    
          // Get the index of a startValue.
          Console.WriteLine("Displaying values greater than or equal to {0}:",
                            startValue);
          int startIndex = numbers.IndexOf(startValue);
          // Display all numbers from startIndex on.
          for (int ctr = startIndex; ctr < numbers.Count; ctr++)
             Console.Write("    {0}", numbers[ctr]);
       }
    }
    // The example displays the following output if the user supplies
    // 7 as a command-line parameter:
    //    Displaying values greater than or equal to 7:
    //    
    //    Unhandled Exception: System.ArgumentOutOfRangeException: 
    //    Index was out of range. Must be non-negative and less than the size of the collection.
    //    Parameter name: index
    //       at System.Collections.Generic.List`1.get_Item(Int32 index)
    //       at Example.ShowValues(Int32 startValue)
    //       at Example.Main()
    

    In diesem Fall die List<T>.IndexOf Methode gibt-1 zurück, der Indexwert ungültig ist, wenn eine Übereinstimmung gefunden. Um diesen Fehler zu beheben, überprüfen Sie die Search-Methode-Rückgabewert bevor das Array durchlaufen, wie im folgenden Beispiel gezeigt.

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       static List<int> numbers = new List<int>();
    
       public static void Main()
       {
          int startValue; 
          string[] args = Environment.GetCommandLineArgs();
          if (args.Length < 2) 
             startValue = 2;
          else 
             if (! Int32.TryParse(args[1], out startValue))
                startValue = 2;
    
          ShowValues(startValue);
       }
    
       private static void ShowValues(int startValue)
       {   
          // Create a collection with numeric values.
          if (numbers.Count == 0)  
             numbers.AddRange( new int[] { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22} );
    
          // Get the index of startValue.
          int startIndex = numbers.IndexOf(startValue);
          if (startIndex < 0) {
             Console.WriteLine("Unable to find {0} in the collection.", startValue);
          }
          else {
             // Display all numbers from startIndex on.
             Console.WriteLine("Displaying values greater than or equal to {0}:",
                            startValue);
             for (int ctr = startIndex; ctr < numbers.Count; ctr++)
                Console.Write("    {0}", numbers[ctr]);
          }
       }
    }
    // The example displays the following output if the user supplies
    // 7 as a command-line parameter:
    //      Unable to find 7 in the collection.
    
  • Verwenden oder ein Resultset, Auflistung oder ein Array ohne testen, ob das zurückgegebene Objekt gültigen Daten von einer Abfrage zurückgegebenen auflisten möchten.

  • Verwenden einen berechneten Wert zum Definieren der startIndex, endIndex oder die Anzahl der Elemente, die durchlaufen werden. Wenn das Ergebnis der Berechnung unerwartet auftritt, es möglicherweise eine IndexOutOfRangeException Ausnahme. Überprüfen Sie die Programmlogik in die Berechnung des Index und den Wert überprüfen, bevor Sie das Array oder die Auflistung durchläuft. Die folgenden Bedingungen müssen erfüllt sein; andernfalls ein IndexOutOfRangeException Ausnahme:

    • Der Startindex muss größer als oder gleich Array.GetLowerBound für die Dimension des Arrays, das zu durchlaufen, oder größer als oder gleich 0 für eine Auflistung.

    • Der endIndex nicht überschreiten Array.GetUpperBound für die Dimension des Arrays, das zu durchlaufen, darf nicht größer als oder gleich der Count -Eigenschaft einer Auflistung.

    • Die folgende Gleichung muss für die Dimension des Arrays zutreffen, die durchlaufen werden soll:

      start_index >= lower_bound And start_index + items_to_iterate – 1 <= upper_bound
      

      Eine Auflistung muss die folgende Gleichung zutreffen:

      start_index >= 0 And start_index + items_to_iterate <= Count
      
      System_CAPS_tipTipp

      Der Startindex für ein Array- oder Auflistungselement kann nie eine negative Zahl sein.

  • Angenommen, ein Array nullbasiert sein muss. Arrays, die nicht nullbasiert sind erstellt werden, indem die Array.CreateInstance(Type, Int32[], Int32[]) Methode und kann von COM-Interop zurückgegeben werden, obwohl sie nicht CLS-kompatibel sind. Das folgende Beispiel veranschaulicht die IndexOutOfRangeException die ausgelöst wird, wenn Sie versuchen, ein nicht-NULL-basierten Array durch Durchlaufen der Array.CreateInstance(Type, Int32[], Int32[]) Methode.

    using System;
    
    public class Example
    {
       public static void Main()
       {
          Array values = Array.CreateInstance(typeof(int), new int[] { 10 }, 
                                              new int[] { 1 });
          int value = 2;
          // Assign values.
          for (int ctr = 0; ctr < values.Length; ctr++) {
             values.SetValue(value, ctr);
             value *= 2;
          }
    
          // Display values.
          for (int ctr = 0; ctr < values.Length; ctr++)
             Console.Write("{0}    ", values.GetValue(ctr));
       }
    }
    // The example displays the following output:
    //    Unhandled Exception: 
    //    System.IndexOutOfRangeException: Index was outside the bounds of the array.
    //       at System.Array.InternalGetReference(Void* elemRef, Int32 rank, Int32* pIndices)
    //       at System.Array.SetValue(Object value, Int32 index)
    //       at Example.Main()
    

    Um wie im folgenden Beispiel wird den Fehler zu beheben, rufen Sie die GetLowerBound Methode anstelle von Annahmen über den Index eines Arrays.

    using System;
    
    public class Example
    {
       public static void Main()
       {
          Array values = Array.CreateInstance(typeof(int), new int[] { 10 }, 
                                              new int[] { 1 });
          int value = 2;
          // Assign values.
          for (int ctr = values.GetLowerBound(0); ctr <= values.GetUpperBound(0); ctr++) {
             values.SetValue(value, ctr);
             value *= 2;
          }
    
          // Display values.
          for (int ctr = values.GetLowerBound(0); ctr <= values.GetUpperBound(0); ctr++)
             Console.Write("{0}    ", values.GetValue(ctr));
       }
    }
    // The example displays the following output:
    //        2    4    8    16    32    64    128    256    512    1024
    

    Beachten Sie, dass beim Aufrufen der GetLowerBound -Methode zum Abrufen der Startindex für ein Array, Sie sollten auch Aufrufen der Array.GetUpperBound(Int32) -Methode zum Abrufen der endIndex.

  • Verwechseln einen Index und den Wert an diesem Index in ein numerisches Array oder eine Auflistung. Dieses Problem tritt in der Regel bei Verwendung der foreach -Anweisung (in c#) oder die For Each -Anweisung (in Visual Basic). Das Problem wird anhand des folgenden Beispiels veranschaulicht.

    using System;
    
    public class Example
    {
       public static void Main()
       {
          // Generate array of random values.
          int[] values = PopulateArray(5, 10);
          // Display each element in the array.
          foreach (var value in values)
             Console.Write("{0}   ", values[value]);
       }
    
       private static int[] PopulateArray(int items, int maxValue)
       {
          int[] values = new int[items];
          Random rnd = new Random();
          for (int ctr = 0; ctr < items; ctr++)
             values[ctr] = rnd.Next(0, maxValue + 1);   
    
          return values;                                                      
       }
    }
    // The example displays output like the following:
    //    6   4   4
    //    Unhandled Exception: System.IndexOutOfRangeException: 
    //    Index was outside the bounds of the array.
    //       at Example.Main()
    

    Das Konstrukt Iteration gibt jeden Wert in ein Array oder einer Auflistung nicht seinen Index zurück. Um die Ausnahme zu vermeiden, verwenden Sie diesen Code ein.

    using System;
    
    public class Example
    {
       public static void Main()
       {
          // Generate array of random values.
          int[] values = PopulateArray(5, 10);
          // Display each element in the array.
          foreach (var value in values)
             Console.Write("{0}   ", value);
       }
    
       private static int[] PopulateArray(int items, int maxValue)
       {
          int[] values = new int[items];
          Random rnd = new Random();
          for (int ctr = 0; ctr < items; ctr++)
             values[ctr] = rnd.Next(0, maxValue + 1);   
    
          return values;                                                      
       }
    }
    // The example displays output like the following:
    //        10   6   7   5   8
    
  • Einen Ungültiger Spaltenname zum Bereitstellen der DataView.Sort Eigenschaft.

  • Verletzung der Threadsicherheit. Vorgänge wie das Lesen aus der gleichen StreamReader -Objekt, das Schreiben in die gleiche StreamWriter Objekt von mehreren Threads oder das Auflisten der Objekte in einer Hashtable von verschiedenen Threads ausgelöst werden können eine IndexOutOfRangeException wenn der Zugriff auf das Objekt auf eine threadsichere Weise ist nicht. Diese Ausnahme ist i. d. r. zeitweilig, da er von einer Racebedingung abhängt.

Mit hartcodierten Indexwerte bearbeitet ein Array ist wahrscheinlich eine Ausnahme auslöst, wenn der Indexwert falsch oder ungültig ist oder die Größe des Arrays Manipulation wird unerwartet ist. Um zu verhindern, dass einen Vorgang von Auslösen einer IndexOutOfRangeException Ausnahme können Sie Folgendes tun:

  • Durchlaufen Sie die Elemente des Arrays mit den foreach -Anweisung (in c#) oder die For Each...Next erstellen (in Visual Basic) anstelle der Elemente nach dem Index durchlaufen.

  • Die Elemente nach Index, beginnend mit der von zurückgegebene Index Durchlaufen der Array.GetLowerBound -Methode und endend mit der von zurückgegebene Index der Array.GetUpperBound Methode.

  • Wenn Sie Elemente in einem Array zu einem anderen zuweisen, stellen Sie sicher, dass im Zielarray mindestens so viele Elemente wie das Quell-Array durch Vergleichen ihrer Array.Length Eigenschaften.

Eine Liste der anfänglichen Eigenschaftenwerte für eine Instanz von IndexOutOfRangeException, finden Sie unter der IndexOutOfRangeException Konstruktoren.

Die folgenden intermediate Language (IL)-Anweisungen auslösen IndexOutOfRangeException:

  • Ldelem. < Typ >

  • ldelema

  • Stelem. < Typ >

IndexOutOfRangeException verwendet HRESULT COR_E_INDEXOUTOFRANGE mit den Wert 0 x 80131508.

Universelle Windows-Plattform
Verfügbar seit 8
.NET Framework
Verfügbar seit 1.1
Portierbare Klassenbibliothek
Unterstützt in: portierbare .NET-Plattformen
Silverlight
Verfügbar seit 2.0
Windows Phone Silverlight
Verfügbar seit 7.0
Windows Phone
Verfügbar seit 8.1

Alle öffentlichen statischen Member ( Shared in Visual Basic) dieses Typs sind threadsicher. Die Threadsicherheit für Instanzmember ist nicht garantiert.

Zurück zum Anfang
Anzeigen: