为什么我的数组抛出超出范围的异常错误?

时间:2009-04-03 23:59:22

标签: c# arrays

为什么以下代码会抛出异常?

for (int i = 0; i <= Items.Length-1; i++)
{
    Console.WriteLine(Items[i,1]);
}

例外:

System.IndexOutOfRangeException was unhandled
  Message="Index was outside the bounds of the array."
  Source="Es"
  StackTrace:
       at Es.Program.Main(String[] args) in C:\Users\Fero\Documents\Visual Studio 2005\Projects\Es\Es\Program.cs:line 19
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()

项目声明:

获取字符串数组的函数:

static string[,] ReadFromFile(string filename, int rowsF)
{
    StreamReader SR;
    string S;
    string[] S_split;

    SR = File.OpenText(filename);
    S = SR.ReadLine();

    string[,] myItems = new String[rowsF, 2];
    int row_number = 0;
    while (S != null)
    {
        S_split = S.Split('"');
        //temp_items[row_number,0] = 
        myItems[row_number,0] = S_split[1];
        myItems[row_number,1] = S_split[2];

        row_number++;
        S = SR.ReadLine();
    }
    SR.Close();
    return myItems;
}

string[,] Items = ReadFromFile(myFile, rowsF);

5 个答案:

答案 0 :(得分:6)

你有一个直的二维数组。长度为数组提供total number of elements,但您使用它来计算单个维度的索引。你想要的是:

for (int i = 0; i < Items.GetLength(0); i++)
{
    Console.WriteLine(Items[i,1]);
}

答案 1 :(得分:2)

检查Items [i]的长度。它看起来像是一个2D数组,它显然不是null,因为你会得到一个不同的异常,因此它可能只是Items [i]中的一个空数组,或者只包含一个项目。

检查:

Items[i] == null
Items[i].Length > 0

编辑:您的其他代码有帮助。当您将字符串拆分为初始化项目时,对于给您带来麻烦的项目,请检查您在索引1处存储的内容。除此之外,我看不出它有问题。

答案 2 :(得分:0)

因为Items[i].Length是&lt; 2

在尝试访问(Items[i].Length >= 2)

之前,您需要先检查Items[i,1]

答案 3 :(得分:0)

从我看到的情况来看,其中一条线路不符合您所需的格式。看起来您正在检索基于引号(“)分隔的文本,而S_split []可能并不总是具有这些数量的字段。

例如,文件末尾的空行将触发异常。

答案 4 :(得分:0)

    S_split = S.Split('"');
    //temp_items[row_number,0] = 
    myItems[row_number,0] = S_split[1];
    myItems[row_number,1] = S_split[2];

你确定你不想要S_Split [0]&amp; S_Split [1]?

应该看到输入文件。