什么是“超出范围的索引”?异常,以及如何修复它

本文关键字:异常 何修复 范围 索引 什么 | 更新日期: 2023-09-27 18:13:27

我得到以下错误之一:

  • "索引超出范围。必须非负且小于集合的大小"
  • "插入索引超出范围。必须非负且小于或等于size。"
  • "索引超出了数组的边界。"

这是什么意思,我如何修复它?

参见
IndexOutOfRangeException
ArgumentOutOfRangeException

什么是“超出范围的索引”?异常,以及如何修复它

为什么会出现这个错误?

因为您试图使用超出集合边界的数字索引访问集合中的元素。

集合中的第一个元素通常位于索引0。最后一个元素位于索引n-1处,其中n是集合的Size(它包含的元素数量)。如果你试图使用一个负数作为索引,或者一个大于Size-1的数字,你将得到一个错误。

索引数组的工作原理

当你像这样声明数组时:

var array = new int[6]

数组的第一个和最后一个元素是

var firstElement = array[0];
var lastElement = array[5];

所以当你写:

var element = array[5];

您正在检索数组中的第六个元素,而不是第五个元素。

通常,你会像这样遍历数组:

for (int index = 0; index < array.Length; index++)
{
    Console.WriteLine(array[index]);
}

这是有效的,因为循环从0开始,并在Length-1结束,因为index不再小于Length

但是,这会抛出一个异常:

for (int index = 0; index <= array.Length; index++)
{
    Console.WriteLine(array[index]);
}

注意到这里的<=吗?在最后一次循环迭代中,index现在将超出范围,因为循环认为Length是一个有效的索引,但它不是。

其他集合是如何工作的

列表的工作方式相同,除了您通常使用Count而不是Length。它们仍然从0开始,到Count - 1结束。

for (int index = 0; i < list.Count; index++)
{
    Console.WriteLine(list[index]);
} 

但是,您也可以使用foreach遍历列表,从而完全避免了索引的整个问题:

foreach (var element in list)
{
    Console.WriteLine(element.ToString());
}

不能索引尚未添加到集合中的元素。

var list = new List<string>();
list.Add("Zero");
list.Add("One");
list.Add("Two");
Console.WriteLine(list[3]);  // Throws exception.