C#报”ArgumentOutOfRangeException”的原因以及解决办法

  • Post category:C#

针对你的问题,我会详细讲解.Net报”ArgumentOutOfRangeException”的原因以及解决办法。

异常原因

“ArgumentOutOfRangeException” 是一种表示所传递的参数值超出有效范围的异常。 当使用数组、集合或字符等数据类型时,如果提供的索引或字符的位置小于 0 或大于数据长度,则会引发此异常。

换句话说,当我们试图使用一个无效或不存在的索引或位置访问一个数组或集合时,就会抛出 “ArgumentOutOfRangeException” 异常。

解决办法

出现 “ArgumentOutOfRangeException” 异常时,我们需要评估代码中引发此异常的原因,并根据原因采取相应的解决方案。下面是解决异常的两种常见方法。

方法一: 检查输入参数是否符合要求

“ArgumentOutOfRangeException” 异常通常是由于使用了无效或超出范围的输入参数而引发的。我们可以通过以下代码防止这种异常的发生:

public int GetValueAtIndex(int[] arr, int index)
{
    if (index < 0 || index >= arr.Length)
    {
        throw new ArgumentException("Index is out of range");
    }

    return arr[index];
}

上面的代码首先检查索引是否小于零或大于等于数组长度,如果是,则引发 ArgumentException 异常。

方法二: 根据实际需要扩大数据范围

如果无法避免数据超出范围的问题,可以使用以下代码进行处理:

public int GetValueAtIndex(int[] arr, int index)
{
    index = Math.Max(index, 0);
    index = Math.Min(index, arr.Length - 1);

    return arr[index];
}

上述代码通过比较索引和数组的长度,将索引限制在有效范围内。

示例

以下示例演示了如何处理 “ArgumentOutOfRangeException” 异常:

示例一:

public void PrintItemAtIndex(string[] arr, int index)
{
    try
    {
        Console.WriteLine(arr[index]);
    }
    catch (ArgumentOutOfRangeException ex)
    {
        Console.WriteLine("ERROR: Index is out of range");
    }
}

上述代码中的 PrintItemAtIndex 方法通过 try-catch 语句处理可能出现的 “ArgumentOutOfRangeException” 异常。如果发生异常,该方法会输出一条错误消息。

示例二:

public int GetLargestNumber(int[] arr)
{
    int max = arr[0];
    for (int i = 1; i < arr.Length; i++)
    {
        if (arr[i] > max)
        {
            max = arr[i];
        }
    }
    return max;
}

上述代码是一个用于获取数组中最大数字的方法。由于该方法使用 arr[i] 来访问数组元素,因此在 i 超出范围时,就会引发 “ArgumentOutOfRangeException” 异常。因此,我们可以在方法开始时检查数组的长度,以确保不会出现超出范围的问题。

public int GetLargestNumber(int[] arr)
{
    if (arr == null || arr.Length == 0) 
    {
        throw new ArgumentException("Array is null or empty");
    }

    int max = arr[0];
    for (int i = 1; i < arr.Length; i++)
    {
        if (arr[i] > max)
        {
            max = arr[i];
        }
    }

    return max;
}

上述代码检查了数组是否为空,以及数组中是否存在元素。