Cet article a fait l’objet d’une traduction automatique. Pour afficher l’article en anglais, activez la case d’option Anglais. Vous pouvez également afficher le texte anglais dans une fenêtre contextuelle en faisant glisser le pointeur de la souris sur le texte traduit.
Traduction
Anglais

IndexOutOfRangeException classe

 

Date de publication : novembre 2016

Exception levée au moment d’une tentative d’accès à un élément d’un tableau ou d’une collection ayant un index en dehors de ses limites.

Espace de noms:   System
Assembly:  mscorlib (dans mscorlib.dll)

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

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

NomDescription
System_CAPS_pubmethodIndexOutOfRangeException()

Initialise une nouvelle instance de la classe IndexOutOfRangeException.

System_CAPS_pubmethodIndexOutOfRangeException(String)

Initialise une nouvelle instance de la classe IndexOutOfRangeException avec un message d'erreur spécifié.

System_CAPS_pubmethodIndexOutOfRangeException(String, Exception)

Initialise une nouvelle instance de la classe IndexOutOfRangeException avec un message d'erreur spécifié et une référence à l'exception interne ayant provoqué cette exception.

NomDescription
System_CAPS_pubpropertyData

Obtient une collection de paires clé/valeur qui fournissent des informations supplémentaires définies par l’utilisateur sur l’exception.(Hérité de Exception.)

System_CAPS_pubpropertyHelpLink

Obtient ou définit un lien vers le fichier d'aide associé à cette exception.(Hérité de Exception.)

System_CAPS_pubpropertyHResult

Obtient ou définit HRESULT, valeur numérique codée qui est assignée à une exception spécifique.(Hérité de Exception.)

System_CAPS_pubpropertyInnerException

Obtient l'instance Exception qui a provoqué l'exception actuelle.(Hérité de Exception.)

System_CAPS_pubpropertyMessage

Obtient un message qui décrit l'exception actuelle.(Hérité de Exception.)

System_CAPS_pubpropertySource

Obtient ou définit le nom de l'application ou de l'objet qui est à l'origine de l'erreur.(Hérité de Exception.)

System_CAPS_pubpropertyStackTrace

Obtient une représentation sous forme de chaîne des objets immédiats sur la pile des appels. (Hérité de Exception.)

System_CAPS_pubpropertyTargetSite

Obtient la méthode qui lève l'exception actuelle.(Hérité de Exception.)

NomDescription
System_CAPS_pubmethodEquals(Object)

Détermine si l'objet spécifié est identique à l'objet actuel.(Hérité de Object.)

System_CAPS_pubmethodGetBaseException()

En cas de substitution dans une classe dérivée, retourne la Exception qui est à l'origine d'une ou de plusieurs exceptions ultérieures.(Hérité de Exception.)

System_CAPS_pubmethodGetHashCode()

Fait office de fonction de hachage par défaut.(Hérité de Object.)

System_CAPS_pubmethodGetObjectData(SerializationInfo, StreamingContext)

En cas de substitution dans une classe dérivée, définit SerializationInfo avec des informations sur l'exception.(Hérité de Exception.)

System_CAPS_pubmethodGetType()

Obtient le type au moment de l'exécution de l'instance actuelle.(Hérité de Exception.)

System_CAPS_pubmethodToString()

Crée et retourne une chaîne représentant l'exception actuelle.(Hérité de Exception.)

Un IndexOutOfRangeException exception est levée lorsqu’un index non valide est utilisé pour accéder à un membre d’un tableau ou une collection, ou pour lire ou écrire à partir d’un emplacement particulier dans une mémoire tampon. Cette exception hérite la Exception classe mais n’ajoute aucuns membres uniques.

En règle générale, un IndexOutOfRangeException est renvoyée à la suite d’erreurs de développement. Au lieu de traiter l’exception, vous devez diagnostiquer la cause de l’erreur et de corriger votre code. Les causes les plus courantes de l’erreur sont :

  • Oublier que la limite supérieure d’une collection ou un tableau de base zéro est une inférieure à son nombre de membres ou éléments, comme l’exemple suivant illustre.

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

    Pour corriger cette erreur, vous pouvez utiliser le code suivant.

    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'
    

    Au lieu d’une itération dans le tableau de tous les éléments par leur index, vous pouvez également utiliser la (en c#) ou (en Visual Basic).

  • Tentative d’assigner un élément de tableau à un autre tableau qui n’a pas été correctement dimensionné et qui a moins d’éléments que le tableau d’origine. L’exemple suivant tente d’attribuer le dernier élément dans le value1 tableau au même élément dans le value2 tableau. Toutefois, le value2 tableau a été correctement dimensionné pour avoir six au lieu de sept éléments. Par conséquent, l’affectation lève une IndexOutOfRangeException exception.

    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()
    
  • À l’aide d’une valeur retournée par une méthode de recherche pour itérer au sein d’une partie d’un tableau ou une collection en commençant à une position d’index spécifique. Si vous oubliez de vérifier si l’opération de recherche a trouvé une correspondance, le runtime lève une IndexOutOfRangeException exception, comme illustré dans cet exemple.

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

    Dans ce cas, le List<T>.IndexOf méthode retourne -1, qui est une valeur d’index non valide, en cas d’échec rechercher une correspondance. Pour corriger cette erreur, vérifiez la valeur de retour de la méthode de recherche avant d’itérer le tableau, comme illustré dans cet exemple.

    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.
    
  • Essayez d’utiliser ou énumérer un jeu de résultats, la collection ou le tableau retourné par une requête sans tester si l’objet retourné comporte des données valides.

  • À l’aide d’une valeur calculée pour définir l’index de départ, l’index de fin ou le nombre d’éléments à itérer. Si le résultat du calcul est inattendu, cela peut entraîner une IndexOutOfRangeException exception. Vérifiez la logique de votre programme dans le calcul de la valeur d’index et valider la valeur avant d’itérer la collection ou du tableau. Les conditions suivantes doivent toutes être vraies ; dans le cas contraire, un IndexOutOfRangeException d’exception :

    • Index de départ doit être supérieure ou égale à Array.GetLowerBound pour la dimension du tableau que vous souhaitez effectuer une itération, ou supérieur ou égal à 0 pour une collection.

    • L’index de fin ne peut pas dépasser Array.GetUpperBound pour la dimension du tableau que vous souhaitez effectuer une itération, ou ne peut pas être supérieure ou égale à la Count propriété d’une collection.

    • L’équation suivante doit être vrai pour la dimension du tableau que vous souhaitez effectuer une itération :

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

      Pour une collection, l’équation suivante doit être remplie :

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

      Index de départ d’un tableau ou une collection ne peut jamais être un nombre négatif.

  • En supposant que le tableau doit être de base zéro. Les tableaux qui ne sont pas de base zéro peuvent être créés par le Array.CreateInstance(Type, Int32[], Int32[]) (méthode) et peuvent être retournées par COM interop, bien qu’ils ne sont pas conformes CLS. L’exemple suivant illustre la IndexOutOfRangeException qui est levée lorsque vous essayez d’itérer au sein d’un tableau de base zéro non créé par le Array.CreateInstance(Type, Int32[], Int32[]) (méthode).

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

    Pour corriger l’erreur, comme dans l’exemple suivant, vous pouvez appeler la GetLowerBound méthode au lieu d’émettre des hypothèses sur les index de départ d’un tableau.

    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
    

    Notez que lorsque vous appelez le GetLowerBound méthode pour obtenir l’index de départ d’un tableau, vous devez également appeler la Array.GetUpperBound(Int32) méthode pour obtenir son index de fin.

  • Confusion entre les index et la valeur à cet index dans une collection ou un tableau numérique. Ce problème se produit généralement lorsque vous utilisez la foreach instruction (c#) ou For Each instruction (en Visual Basic). L'exemple de code suivant illustre le problème.

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

    La construction d’itération retourne chaque valeur dans un tableau ou collection, pas son index. Pour éliminer l’exception, utilisez ce code.

    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
    
  • En fournissant un nom de colonne non valide pour le DataView.Sort propriété.

  • Violation de sécurité des threads. Opérations telles que la lecture de la même StreamReader écriture d’objet, à la même StreamWriter de l’objet à partir de plusieurs threads ou énumérer les objets dans un Hashtable à partir de différents threads peut lever un IndexOutOfRangeException Si l’objet n’est pas accessible de manière thread-safe. Cette exception est généralement aléatoire, car il repose sur une condition de concurrence.

À l’aide des valeurs d’index codé en dur pour manipuler un tableau est susceptible de lever une exception si la valeur d’index est incorrect ou non valide, ou si la taille du tableau en cours de manipulation est inattendue. Pour empêcher une opération de lever un IndexOutOfRangeException exception, vous pouvez procédez comme suit :

  • Itérer les éléments du tableau en utilisant la foreach instruction (c#) ou For Each...Next construire (en Visual Basic) au lieu de l’itération des éléments par index.

  • Itérer les éléments par index commençant par l’index retourné par la Array.GetLowerBound (méthode) et se terminant par l’index retourné par la Array.GetUpperBound méthode.

  • Si vous assignez des éléments dans un tableau à un autre, assurez-vous que la baie cible a au moins autant d’éléments que le tableau source en comparant leurs Array.Length Propriétés.

Pour obtenir la liste des valeurs initiales des propriétés d’une instance de IndexOutOfRangeException, consultez la IndexOutOfRangeException constructeurs.

Les instructions de langage intermédiaire (IL) suivantes lèvent IndexOutOfRangeException:

  • < type > ldelem.

  • ldelema

  • < type > stelem.

IndexOutOfRangeException utilise le HRESULT COR_E_INDEXOUTOFRANGE dont la valeur est 0 x 80131508.

Plateforme Windows universelle
Disponible depuis 8
.NET Framework
Disponible depuis 1.1
Bibliothèque de classes portable
Pris en charge dans : plateformes .NET portables
Silverlight
Disponible depuis 2.0
Silverlight pour Windows Phone
Disponible depuis 7.0
Windows Phone
Disponible depuis 8.1

Tous les membres statiques publics ( Shared en Visual Basic) de ce type sont thread-safe. Les membres d’instance n’ont pas la garantie d’être thread-safe.

Retour au début
Afficher: