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

28
1个回答

44

为什么会出现此错误?

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

集合中的第一个元素通常位于索引0处。最后一个元素位于索引n-1处,其中n是集合的大小(它包含的元素数量)。如果您尝试使用负数作为索引,或者使用大于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]);
}

这段代码之所以正常运行,是因为循环从零开始,并在Length-1结束,因为此时index不再小于Length

然而,以下代码将抛出异常:

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

注意那里的<=了吗?最后一个循环迭代中,index将会超出范围,因为循环认为Length是一个有效的索引,但实际上它不是。

其他集合的工作方式

列表的工作方式相同,只是通常使用Count而不是Length。他们仍然从零开始,到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.

有点相关... 何时使用Array vs List<T> - tnw
你可能需要提醒一下,与数组不同,索引器不能用于向列表中添加新项,它只能用于修改现有项。例如 var list = new List<int>(10); list[0] = 10; 将会抛出 IndexOutOfRange 异常。 - Selman Genç

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接