Číst v angličtině

Sdílet prostřednictvím


IndexOutOfRangeException Třída

Definice

Výjimka vyvoláná při pokusu o přístup k prvku pole nebo kolekce s indexem, který je mimo jeho hranice.

public sealed class IndexOutOfRangeException : Exception
public sealed class IndexOutOfRangeException : SystemException
[System.Serializable]
public sealed class IndexOutOfRangeException : SystemException
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class IndexOutOfRangeException : SystemException
Dědičnost
IndexOutOfRangeException
Dědičnost
IndexOutOfRangeException
Atributy

Poznámky

Výjimka IndexOutOfRangeException se vyvolá, když se neplatný index používá pro přístup k členu pole nebo kolekce nebo ke čtení nebo zápisu z konkrétního umístění v vyrovnávací paměti. Tato výjimka dědí z Exception třídy, ale nepřidá žádné jedinečné členy.

Výjimka IndexOutOfRangeException se obvykle vyvolá v důsledku chyby vývojáře. Místo zpracování výjimky byste měli diagnostikovat příčinu chyby a opravit kód. Nejběžnější příčiny chyby jsou:

  • Zapomeňte, že horní mez kolekce nebo pole založené na nule je jedna menší než jeho počet členů nebo prvků, jak ukazuje následující příklad.

    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()
    

    K opravě chyby můžete použít kód podobný následujícímu.

    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'
    

    Alternativně můžete místo iterace všech prvků v poli pomocí jejich indexu použít foreach příkaz (v jazyce C#), for...in příkaz (v jazyce F#) nebo For Each příkaz (v Visual Basic).

  • Pokus o přiřazení elementu pole k jiné matici, která nebyla odpovídajícím způsobem kótována a která obsahuje méně prvků než původní pole. Následující příklad se pokusí přiřadit poslední prvek v value1 poli stejnému prvku v value2 poli. Pole však bylo nesprávně kótováno tak, value2 aby místo sedmi prvků bylo šest. V důsledku toho přiřazení vyvolá IndexOutOfRangeException výjimku.

    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()
    
  • Použití hodnoty vrácené vyhledávací metodou k iteraci části pole nebo kolekce začínající na konkrétní pozici indexu. Pokud zapomenete zkontrolovat, jestli operace hledání našla shodu, modul runtime vyvolá IndexOutOfRangeException výjimku, jak je znázorněno v tomto příkladu.

    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()
    

    V tomto případě List<T>.IndexOf metoda vrátí hodnotu -1, což je neplatná hodnota indexu, pokud se nepodaří najít shodu. Chcete-li tuto chybu opravit, zkontrolujte návratovou hodnotu metody vyhledávání před iterací pole, jak je znázorněno v tomto příkladu.

    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.
    
  • Pokus o použití nebo výčet sady výsledků, kolekce nebo pole vráceného dotazem bez testování, zda vrácený objekt obsahuje platná data.

  • Pomocí počítané hodnoty definujete počáteční index, koncový index nebo počet položek, které se mají iterovat. Pokud je výsledek výpočtu neočekávaný, může dojít k výjimce IndexOutOfRangeException . Logiku programu byste měli zkontrolovat při výpočtu hodnoty indexu a ověřit hodnotu před iterací pole nebo kolekce. Všechny následující podmínky musí být pravdivé; IndexOutOfRangeException jinak se vyvolá výjimka:

    • Počáteční index musí být větší nebo roven Array.GetLowerBound dimenzi pole, kterou chcete iterovat, nebo větší než nebo rovnou 0 pro kolekci.

    • Koncový index nemůže překročit Array.GetUpperBound dimenzi pole, kterou chcete iterovat, nebo nesmí být větší nebo rovno Count vlastnosti kolekce.

    • Následující rovnice musí být pravdivá pro dimenzi pole, kterou chcete iterovat:

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

      Pro kolekci musí být následující rovnice pravdivá:

      start_index >= 0 And start_index + items_to_iterate <= Count  
      

      Tip

      Počáteční index pole nebo kolekce nemůže být nikdy záporným číslem.

  • Za předpokladu, že pole musí být založené na nule. Pole, která nejsou založená na nule, je možné vytvořit metodou Array.CreateInstance(Type, Int32[], Int32[]) a může ji vrátit interop modelu COM, i když nejsou kompatibilní s CLS. Následující příklad znázorňuje, že je vyvolán při pokusu IndexOutOfRangeException iterovat nenulové pole vytvořené metodou Array.CreateInstance(Type, Int32[], Int32[]) .

    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()
    

    Chcete-li chybu opravit, protože následující příklad dělá, můžete metodu GetLowerBound volat namísto vytváření předpokladů o počátečním indexu pole.

    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
    

    Všimněte si, že když zavoláte metodu GetLowerBound pro získání počátečního indexu pole, měli byste také volat metodu Array.GetUpperBound(Int32) pro získání jeho koncového indexu.

  • Matoucí index a hodnotu v daném indexu v číselném poli nebo kolekci. K tomuto problému obvykle dochází při použití foreach příkazu (v jazyce C#), for...in příkazu (v jazyce F#) nebo For Each příkazu (v Visual Basic). Následující příklad ukazuje tento problém.

    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()
    

    Konstruktor iterace vrátí každou hodnotu v poli nebo kolekci, nikoli její index. Pokud chcete výjimku odstranit, použijte tento kód.

    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
    
  • Zadejte neplatný název sloupce vlastnosti DataView.Sort .

  • Porušení bezpečnosti závitu. Operace, jako je čtení ze stejného StreamReader objektu, zápis do stejného StreamWriter objektu z více vláken nebo výčet objektů v Hashtable různých vláknech může vyvolat IndexOutOfRangeException , pokud k objektu není přístup v bezpečném vlákně. Tato výjimka je obvykle přerušovaná, protože spoléhá na stav rasy.

Použití pevně zakódovaných hodnot indexu k manipulaci s polem pravděpodobně vyvolá výjimku, pokud je hodnota indexu nesprávná nebo neplatná nebo pokud je velikost pole neočekávaná. Pokud chcete operaci zabránit vyvolání IndexOutOfRangeException výjimky, můžete provést následující kroky:

  • Iterujte prvky pole pomocí příkazu foreach (v jazyce C#), příkazu for... in statement (in F#) nebo For Each... Další konstruktor (v Visual Basic) místo iterace prvků indexem

  • Iterujte prvky indexem počínaje indexem vráceným Array.GetLowerBound metodou a končí indexem vráceným metodou Array.GetUpperBound .

  • Pokud přiřazujete prvky v jedné matici k druhému, ujistěte se, že má cílové pole alespoň tolik prvků jako zdrojová pole, a to porovnáním jejich Array.Length vlastností.

Seznam počátečních hodnot vlastností pro instanci IndexOutOfRangeExceptionnaleznete v IndexOutOfRangeException konstruktorech.

Vyvolá se následující pokyny IndexOutOfRangeExceptionpro zprostředkující jazyk (IL):

  • ldelem.<type>

  • ldelema

  • stelem.<type>

IndexOutOfRangeException používá COR_E_INDEXOUTOFRANGE HRESULT, který má hodnotu 0x80131508.

Konstruktory

IndexOutOfRangeException()

Inicializuje novou instanci IndexOutOfRangeException třídy.

IndexOutOfRangeException(String)

Inicializuje novou instanci třídy se zadanou chybovou IndexOutOfRangeException zprávou.

IndexOutOfRangeException(String, Exception)

Inicializuje novou instanci IndexOutOfRangeException třídy se zadanou chybovou zprávou a odkazem na vnitřní výjimku, která je příčinou této výjimky.

Vlastnosti

Data

Získá kolekci párů klíč/hodnota, které poskytují další uživatelem definované informace o výjimce.

(Zděděno od Exception)
HelpLink

Získá nebo nastaví odkaz na soubor nápovědy přidružený k této výjimce.

(Zděděno od Exception)
HResult

Získá nebo nastaví HRESULT, kódovanou číselnou hodnotu přiřazenou konkrétní výjimce.

(Zděděno od Exception)
InnerException

Exception Získá instanci, která způsobila aktuální výjimku.

(Zděděno od Exception)
Message

Získá zprávu, která popisuje aktuální výjimku.

(Zděděno od Exception)
Source

Získá nebo nastaví název aplikace nebo objektu, který způsobuje chybu.

(Zděděno od Exception)
StackTrace

Získá řetězcové znázornění okamžitých rámců v zásobníku volání.

(Zděděno od Exception)
TargetSite

Získá metodu, která vyvolá aktuální výjimku.

(Zděděno od Exception)

Metody

Equals(Object)

Určí, zda se zadaný objekt rovná aktuálnímu objektu.

(Zděděno od Object)
GetBaseException()

Při přepsání v odvozené třídě vrátí Exception hodnotu, která je hlavní příčinou jedné nebo více následných výjimek.

(Zděděno od Exception)
GetHashCode()

Slouží jako výchozí funkce hash.

(Zděděno od Object)
GetObjectData(SerializationInfo, StreamingContext)

Při přepsání v odvozené třídě nastaví s SerializationInfo informacemi o výjimce.

(Zděděno od Exception)
GetType()

Získá typ modulu runtime aktuální instance.

(Zděděno od Exception)
MemberwiseClone()

Vytvoří použádnou kopii aktuálního souboru Object.

(Zděděno od Object)
ToString()

Vytvoří a vrátí řetězcovou reprezentaci aktuální výjimky.

(Zděděno od Exception)

událost

SerializeObjectState
Zastaralé.

Nastane, když je výjimka serializována k vytvoření objektu stavu výjimky, který obsahuje serializovaná data o výjimce.

(Zděděno od Exception)

Platí pro

Produkt Verze
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Viz také