什么是“超出范围的索引”?异常,以及如何修复它
本文关键字:异常 何修复 范围 索引 什么 | 更新日期: 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.