C#支持将数组作为数据结构进行创建和操作。数组的索引是一个整数值,其值的范围为[0,n-1],其中n是数组的大小。如果请求一个负数或索引大于或等于数组的大小,则C#会引发System.IndexOutOfRange异常。这与C / C++不同,在C / C++中,没有完成绑定检查的索引。 IndexOutOfRangeException是仅在运行时引发的运行时异常。 C#编译器在程序编译期间不会检查此错误。
例子:
// 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]);
}
}
运行时错误:
Unhandled Exception:
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at GFG.Main (System.String[] args) <0x40bdbd50 + 0x00067> in
[ERROR] FATAL UNHANDLED EXCEPTION: System.IndexOutOfRangeException: Index was outside the bounds of the array.
at GFG.Main (System.String[] args) <0x40bdbd50 + 0x00067> in
输出:
1
2
3
4
5
在这里,如果您仔细地看一下,数组的大小为5。因此,在使用for循环访问其元素时,index的最大值可以为4,但是在我们的程序中,它将达到5,因此是异常。
让我们来看另一个使用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]);
}
}
运行时错误:与以前的错误相比,这里的错误更具信息性,如下所示:
Unhandled Exception:
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
at System.Collections.ArrayList.get_Item (Int32 index) <0x7f2d36b2ff40 + 0x00082> in
at GFG.Main (System.String[] args) <0x41b9fd50 + 0x0008b> in
[ERROR] FATAL UNHANDLED EXCEPTION: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
at System.Collections.ArrayList.get_Item (Int32 index) <0x7f2d36b2ff40 + 0x00082> in
at GFG.Main (System.String[] args) <0x41b9fd50 + 0x0008b> in
让我们更详细地了解一下:
- 此处的索引定义了我们尝试访问的索引。
- 大小为我们提供了列表大小的信息。
- 由于size为2,所以我们可以访问的最后一个索引为(2-1)= 1,因此例外
访问数组的正确方法是:
for (int i = 0; i < ar.Length; i++)
{
}
处理异常:
- 使用for-each循环:在访问数组的元素时,它会自动处理索引。
- 句法:
for(int variable_name in array_variable) { // loop body }
- 句法:
- 使用Try-Catch:考虑将代码包含在try-catch语句中,并相应地处理异常。如前所述,C#不允许您访问无效的索引,并且肯定会抛出IndexOutOfRangeException。但是,我们应该在catch语句的块内小心,因为如果我们没有适当地处理异常,我们可能会将其隐藏,从而在您的应用程序中创建错误。