获取“索引超出数组范围”异常

Posted

技术标签:

【中文标题】获取“索引超出数组范围”异常【英文标题】:Getting "Index was outside the bounds of the array" exception 【发布时间】:2012-02-25 08:31:20 【问题描述】:

我们有一个包含两列“word”和“binary”的数据表“st”

void replace()
    

        string s1="", s2="";            
        StreamReader streamReader;
        streamReader = File.OpenText("C:\\text.txt");
        StreamWriter streamWriter = File.CreateText("C:\\sample1.txt");
        int x = st.Rows.Count;
       // int i1 = 0;                                       
            // Now, read the entire file into a string
            while ((line = streamReader.ReadLine()) != null)
            
                for (int i = 0; i < x; i++)
                

                s1 = Convert.ToString(st.Rows[i]["Word"]);
                s2 = Convert.ToString(st.Rows[i]["Binary"]);
                s2+="000";
                char[] delimiterChars =  ' ', '\t' ;
                String[] words = line.Split(delimiterChars);

                    // Write the modification into the same file                    
                String ab = words[i]; //exception occurs here
                // Console.WriteLine(ab);
                streamWriter.Write(ab.Replace(s1,s2));                                 
                                
            
        streamReader.Close();
        streamWriter.Close();
    

我们收到“索引超出数组范围”异常。我们无法找到问题所在。提前致谢

编辑: tnx 给所有帮助过的人。 我这样做了,它以某种方式起作用:

 void replace()
    
        string s1 = "", s2 = "";
        StreamReader streamReader;
        streamReader = File.OpenText("C:\\sample1.txt");
        StreamWriter streamWriter = File.CreateText("C:\\sample1.txt");
        int x = st.Rows.Count;           
        while ((line = streamReader.ReadLine()) != null)
        
            char[] delimiterChars =  ' ', '\t' ;
            String[] words = line.Split(delimiterChars);
            foreach (string str in words)
            

                s1 = str;
                DataRow drow = st.Rows.Find(str);
                if (drow != null)
                
                    index = st.Rows.IndexOf(drow);
                    s2 = Convert.ToString(st.Rows[index]["Binary"]);
                  // s2 += "000";
                    // ab = words[i];                        
                    Console.WriteLine(s1);
                    Console.WriteLine(s2);
                    streamWriter.Write(str.Replace(s1, s2));                                 
                
                else
                    break;
                           
        
        streamReader.Close();
        streamWriter.Close();
    

tnx 再次给大家。 问候, 萨格尔

【问题讨论】:

【参考方案1】:

您基于 i 的方式是行数,即 X,而不是字符串数组的长度。因此,您可能有 100 行,但字符串仅拆分为 5 个字符串值。

【讨论】:

【参考方案2】:

i 是您所在行的索引。

while ((line = streamReader.ReadLine()) != null)

   for (int i = 0; i < x; i++)  // say we are on line 20

words 包含该行的单词数组。

String[] words = line.Split(delimiterChars); // say there are 3 words on line 20

如果该行中的单词少于行索引...您会得到一个超出范围的异常。

String ab = words[i]; // trying to get to word 20 out of 3...

您需要为该行中的字数使用有效的索引值 - 不清楚您在代码中究竟想要实现什么,所以我无法提供示例。

【讨论】:

【参考方案3】:

如果您有一个假设行“a b c d e”,例如文件中的第一行,并且您的数据库“st”包含 10 行,则您将循环执行该过程 10 次,在第 6 次遇到错误时。第 6 步会将字符串拆分为:a, b, c, d, e,然后尝试获取数组外部的第 5 个索引(从零开始)。

【讨论】:

那我该如何避免呢?请帮助 @vidya 如果我从示例中了解您的应用程序,您正在寻找要在字符串中替换的单词,然后将修改后的字符串放回文件中。首先,我会尽可能地将所有步骤提升到内部循环之外,拆分字符串和分隔符可以在 for 循环之外完成。然后在 for 循环中,您实际上想要查看要替换的拆分字符串中的每个单词。这样做的一种方法是添加一个迭代每个拆分词的 for 循环。更简单直接的方法是使用 List 和扩展方法【参考方案4】:

使用调试器查看linewords 数组中的内容,并将其与i 的值进行比较。调试器是你最好的朋友。

【讨论】:

以上是关于获取“索引超出数组范围”异常的主要内容,如果未能解决你的问题,请参考以下文章

索引超出数组范围:杂货项目列表添加

如何修复此 System.IndexOutOfRangeException:索引超出数组范围

转换向量索引超出数组边界 - matlab

奇怪的 Visual Studio 2012 异常:无法使用文本编辑器

统一出现错误 IndexOutOfRange 但仍在工作

wps网络异常无法获取用户信息?