Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Clase IndexOutOfRangeException

 

Publicado: octubre de 2016

Excepción que se inicia cuando se intenta acceder a un elemento de una matriz o una colección con un índice que está fuera de los límites.

Espacio de nombres:   System
Ensamblado:  mscorlib (en mscorlib.dll)

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

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

NombreDescripción
System_CAPS_pubmethodIndexOutOfRangeException()

Inicializa una nueva instancia de la clase IndexOutOfRangeException.

System_CAPS_pubmethodIndexOutOfRangeException(String)

Inicializa una nueva instancia de la clase IndexOutOfRangeException con el mensaje de error especificado.

System_CAPS_pubmethodIndexOutOfRangeException(String, Exception)

Inicializa una nueva instancia de la clase IndexOutOfRangeException con el mensaje de error especificado y una referencia a la excepción interna que representa la causa de esta excepción.

NombreDescripción
System_CAPS_pubpropertyData

Obtiene una colección de pares clave-valor que proporcionan más información definida por el usuario sobre la excepción.(Heredado de Exception).

System_CAPS_pubpropertyHelpLink

Obtiene o establece un vínculo al archivo de ayuda asociado a esta excepción.(Heredado de Exception).

System_CAPS_pubpropertyHResult

Obtiene o establece HRESULT, un valor numérico codificado que se asigna a una excepción específica.(Heredado de Exception).

System_CAPS_pubpropertyInnerException

Obtiene la instancia Exception que produjo la excepción actual.(Heredado de Exception).

System_CAPS_pubpropertyMessage

Obtiene un mensaje que describe la excepción actual.(Heredado de Exception).

System_CAPS_pubpropertySource

Devuelve o establece el nombre de la aplicación o del objeto que generó el error.(Heredado de Exception).

System_CAPS_pubpropertyStackTrace

Obtiene una representación de cadena de los marcos inmediatos en la pila de llamadas.(Heredado de Exception).

System_CAPS_pubpropertyTargetSite

Obtiene el método que produjo la excepción actual.(Heredado de Exception).

NombreDescripción
System_CAPS_pubmethodEquals(Object)

Determina si el objeto especificado es igual al objeto actual.(Heredado de Object).

System_CAPS_pubmethodGetBaseException()

Cuando se invalida en una clase derivada, devuelve la clase Exception que representa la causa principal de una o más excepciones posteriores.(Heredado de Exception).

System_CAPS_pubmethodGetHashCode()

Sirve como la función hash predeterminada.(Heredado de Object).

System_CAPS_pubmethodGetObjectData(SerializationInfo, StreamingContext)

Cuando se invalida en una clase derivada, establece SerializationInfo con información sobre la excepción.(Heredado de Exception).

System_CAPS_pubmethodGetType()

Obtiene el tipo en tiempo de ejecución de la instancia actual.(Heredado de Exception).

System_CAPS_pubmethodToString()

Crea y devuelve una representación de cadena de la excepción actual.(Heredado de Exception).

Un IndexOutOfRangeException excepción se produce cuando se utiliza un índice no válido para tener acceso a un miembro de una matriz o una colección, o para leer o escribir desde una ubicación determinada en un búfer. Esta excepción se hereda de la Exception clase pero no agrega ningún miembro único.

Normalmente, un IndexOutOfRangeException excepción se produce como resultado de error de desarrollador. En lugar de controlar la excepción, debe diagnosticar la causa del error y corrija el código. Las causas más comunes del error son:

  • Olvidar que el límite superior de una colección o una matriz basada en cero es uno menor que el número de miembros o elementos, como en el ejemplo siguiente se muestra.

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

    Para corregir el error, puede utilizar código similar al siguiente.

    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'
    

    Como alternativa, en lugar de recorrer en iteración todos los elementos de la matriz por su índice, puede utilizar la (en C#) o (en Visual Basic).

  • Intento de asignar un elemento de matriz en otra matriz que no se han dimensionada adecuadamente y que tiene menos elementos que la matriz original. En el ejemplo siguiente se intenta asignar al último elemento de la value1 matriz al mismo elemento en el value2 matriz. Sin embargo, la value2 matriz ha sido dimensionada incorrectamente para tener seis en lugar de siete elementos. Como resultado, se produce la asignación de un IndexOutOfRangeException excepción.

    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()
    
  • Uso de un valor devuelto por un método de búsqueda para recorrer en iteración una parte de una matriz o colección empezando en una posición de índice determinada. Si te olvidas de comprobar si la operación de búsqueda encuentra una coincidencia, el runtime produce una IndexOutOfRangeException excepción, como se muestra en este ejemplo.

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

    En este caso, el List<T>.IndexOf método devuelve -1, que es un valor de índice no válido cuando se produce un error buscar una coincidencia. Para corregir este error, compruebe el valor devuelto del método de búsqueda antes de recorrer en iteración la matriz, como se muestra en este ejemplo.

    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.
    
  • Al intentar utilizar o enumerar un conjunto de resultados, colección o matriz devueltos por una consulta sin comprobar si el objeto devuelto tiene datos válidos.

  • Usar un valor calculado para definir el índice inicial, el índice final o el número de elementos que se recorre en iteración. Si el resultado del cálculo es inesperado, puede provocar una IndexOutOfRangeException excepción. Debe comprobar la lógica del programa para calcular el valor de índice y validar el valor antes de recorrer en iteración la matriz o colección. Las siguientes condiciones deben ser true; de lo contrario, un IndexOutOfRangeException excepción:

    • Índice inicial debe ser mayor o igual a Array.GetLowerBound para la dimensión de la matriz en la que desea realizar una iteración, o mayor o igual que 0 para una colección.

    • No puede superar el índice final Array.GetUpperBound para la dimensión de la matriz que se desea iterar, o no puede ser mayor o igual que el Count propiedad de una colección.

    • La ecuación siguiente debe ser true para la dimensión de la matriz que se desea iterar:

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

      Para una colección, debe cumplirse la siguiente ecuación:

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

      Índice inicial de una matriz o colección nunca puede ser un número negativo.

  • Suponiendo que la matriz debe ser de base cero. Las matrices que no son de base cero pueden crearse mediante el Array.CreateInstance(Type, Int32[], Int32[]) método y se pueden obtener mediante la interoperabilidad COM, aunque no son conformes a CLS. En el ejemplo siguiente se muestra el IndexOutOfRangeException que se produce cuando intenta recorrer en iteración una matriz no basado en cero que crea el Array.CreateInstance(Type, Int32[], Int32[]) método.

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

    Para corregir el error, como en el siguiente ejemplo, se puede llamar a la GetLowerBound método en lugar de hacer suposiciones sobre el índice inicial de una matriz.

    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
    

    Tenga en cuenta que al llamar a la GetLowerBound método para obtener el índice inicial de una matriz, también deberá llamar el Array.GetUpperBound(Int32) método para obtener su índice final.

  • Confuso un índice y el valor en ese índice en una matriz numérica o de la colección. Este problema normalmente se produce cuando se usa el foreach instrucción (en C#) o For Each instrucción (en Visual Basic). En el siguiente ejemplo se ilustra el problema.

    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 construcción de la iteración devuelve cada valor en una matriz o colección, no su índice. Para eliminar la excepción, use este código.

    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
    
  • Proporcionar un nombre de columna no válido para el DataView.Sort propiedad.

  • Infracción de seguridad para subprocesos. Operaciones como la lectura de la misma StreamReader objeto, escribir en el mismo StreamWriter objeto desde varios subprocesos, o enumerar los objetos de un Hashtable de subprocesos diferentes puede producir un IndexOutOfRangeException Si no tiene acceso al objeto de una manera segura para subprocesos. Esta excepción es normalmente intermitente porque se basa en una condición de carrera.

Con valores de índice codificado de forma rígida para manipular una matriz es probable que produzca una excepción si el valor de índice es incorrecta o no es válido o si el tamaño de la matriz que se va a manipulación es inesperado. Para evitar que una operación genere un IndexOutOfRangeException excepción, puede hacer lo siguiente:

  • Recorrer en iteración los elementos de la matriz mediante la foreach instrucción (en C#) o la For Each...Next construir (en Visual Basic) en lugar de recorrer en iteración los elementos por índice.

  • Recorrer en iteración los elementos por índice, empezando por el índice devuelto por el Array.GetLowerBound (método) y terminando con el índice devuelto por el Array.GetUpperBound (método).

  • Si se asignan elementos de una matriz a otra, asegúrese de que la matriz de destino tiene al menos tantos elementos como la matriz de origen comparando sus Array.Length Propiedades.

Para obtener una lista de valores de propiedad iniciales de una instancia de IndexOutOfRangeException, consulte el IndexOutOfRangeException constructores.

Las siguientes instrucciones de lenguaje intermedio (IL) producen IndexOutOfRangeException:

  • ldelem < tipo >.

  • ldelema

  • stelem < tipo >.

IndexOutOfRangeException utiliza HRESULT COR_E_INDEXOUTOFRANGE, que tiene el valor 0 x 80131508.

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 1.1
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Silverlight
Disponible desde 2.0
Windows Phone Silverlight
Disponible desde 7.0
Windows Phone
Disponible desde 8.1

Cualquier miembro ( Compartido en Visual Basic) estático público de este tipo es seguro para subprocesos. No se garantiza que los miembros de instancia sean seguros para subprocesos.

Volver al principio
Mostrar: