C# | Excepción Array IndexOutofRange

C# admite la creación y manipulación de arrays, como una estructura de datos. El índice de una array es un valor entero que tiene valor en el intervalo [0, n-1], donde n es el tamaño de la array. Si se realiza una solicitud de un índice negativo o mayor o igual que el tamaño de la array, C# genera una excepción System.IndexOutOfRange . Esto es diferente a C/C++, donde no se realiza ningún índice de la verificación enlazada. IndexOutOfRangeException es una excepción de tiempo de ejecución lanzada solo en tiempo de ejecución. El compilador de C# no busca este error durante la compilación de un programa.

Ejemplo:

// C# program to demonstrate the 
// IndexOutofRange Exception in array
using System;
  
public class GFG {
      
    // Main Method
    public static void Main(String[] args)
    {
        int[] ar = {1, 2, 3, 4, 5};
          
        // causing exception
        for (int i = 0; i <= ar.Length; i++)
            Console.WriteLine(ar[i]);
    }
}

Error de tiempo de ejecución:

Excepción no controlada:
System.IndexOutOfRangeException: el índice estaba fuera de los límites de la array.
en GFG.Main (System.String[] args) <0x40bdbd50 + 0x00067> en:0
[ERROR] EXCEPCIÓN FATAL NO MANEJADA: System.IndexOutOfRangeException: el índice estaba fuera de los límites de la array.
en GFG.Main (System.String[] args) <0x40bdbd50 + 0x00067> en:0

Producción:

1
2
3
4
5

Aquí, si observa detenidamente, la array tiene un tamaño de 5. Por lo tanto, al acceder a su elemento mediante el ciclo for, el valor máximo de índice puede ser 4, pero en nuestro programa, va hasta 5 y, por lo tanto, es la excepción.

Veamos otro ejemplo usando ArrayList :

// C# program to demonstrate the 
// IndexOutofRange Exception in array
using System;
using System.Collections;
  
public class GFG {
      
    // Main Method
    public static void Main(String[] args)
    {
          
        // using ArrayList
        ArrayList lis = new ArrayList();
        lis.Add("Geeks");
        lis.Add("GFG");
        Console.WriteLine(lis[2]);
    }
}

Error de tiempo de ejecución: aquí el error es un poco más informativo que el anterior de la siguiente manera:

Excepción no controlada:
System.ArgumentOutOfRangeException: el índice estaba fuera de rango. Debe ser no negativo y menor que el tamaño de la colección.
Nombre del parámetro: índice
en System.Collections.ArrayList.get_Item (índice Int32) <0x7f2d36b2ff40 + 0x00082> en:0
en GFG.Main (System.String[] argumentos) <0x41b9fd50 + 0x0008b> en:0
[ERROR] EXCEPCIÓN FATAL NO MANEJADA: System.ArgumentOutOfRangeException: el índice estaba fuera de rango. Debe ser no negativo y menor que el tamaño de la colección.
Nombre del parámetro: índice
en System.Collections.ArrayList.get_Item (índice Int32) <0x7f2d36b2ff40 + 0x00082> en:0
en GFG.Main (System.String[] argumentos) <0x41b9fd50 + 0x0008b> en:0

Vamos a entenderlo con un poco de detalle:

  • Índice aquí define el índice al que estamos tratando de acceder.
  • El tamaño nos da información del tamaño de la lista.
  • Dado que el tamaño es 2, el último índice al que podemos acceder es (2-1) = 1 y, por lo tanto, la excepción

La forma correcta de acceder a la array es:

for (int i = 0; i < ar.Length; i++) 
{
}

Manejo de la excepción:

  • Use for-each loop: esto maneja automáticamente los índices al acceder a los elementos de una array.
    • Sintaxis:
      for(int variable_name in array_variable)
      {
           // loop body
      }
      
      
  • Use Try-Catch: considere encerrar su código dentro de una instrucción try-catch y manipule la excepción en consecuencia. Como se mencionó, C# no le permitirá acceder a un índice no válido y definitivamente generará una excepción IndexOutOfRangeException. Sin embargo, debemos tener cuidado dentro del bloque de la instrucción catch, porque si no manejamos la excepción de manera adecuada, podemos ocultarla y, por lo tanto, crear un error en su aplicación.

Publicación traducida automáticamente

Artículo escrito por Akanksha_Rai y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *