System.ArgumentOutOfRangeException:索引和长度必须引用字符串中的位置

时间:2013-07-10 19:05:50

标签: c# .net

当我在visual studio上执行我的代码时,它运行良好,但是当我执行我的exe文件时,它会抛出异常。

System.ArgumentOutOfRangeException: Index and length must refer to a location within the string.
Parameter name: length
at System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)
at System.String.Substring(Int32 startIndex, Int32 length)
 at QuoteExtractor.frmQuoteExtractor.cmdProcess_Click(Object sender, EventArgs e)

我的代码

    private void cmdProcess_Click(object sender, EventArgs e)
    {
        try
        {

            foreach (string line in rtfMain.Lines)
            {
                try
                {
                    if (line.Trim() != "")
                    {
                        if ((line != "") && (line != " ") && (line.Substring(0, 3) != "***") && (line.Substring(0, 5) != "CUSIP"))
                        {
                            Quote q = new Quote();
                            q.Parse(line);
                            DisplayQuote(q);
                            QuoteList.Add(q);
                        }
                    }
                }

输入:

   *** 9:30 AM ***    
   CUSIP          BOND NAME              SIZE       CURR FACE     TALK        COVER PX 
   004421GU1     ACE 2004-HE2 M2       10.000MM     1.103MM               dnt, 90 rsrv
   61744CTZ9     MSHEL 2005-3 M3       4.720MM      4.720MM               dnt

4 个答案:

答案 0 :(得分:10)

阅读错误消息。 1

之一
line.Substring(0, 3) != "***"

line.Substring(0, 5) != "CUSIP"

很糟糕,因为line的长度分别小于三或五。另外,为此目的使用String.StartsWith

1 :错误信息实际上是在尖叫你:

  

System.ArgumentOutOfRangeExceptionIndexlength必须引用字符串中的某个位置。参数名称:length 位于System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)的{​​{1}}

您传递给System.String.Substring(Int32 startIndex, Int32 length) length 参数存在问题,这已经不是很清楚了。来自documentation

  

例外

     

String.Substring

     

ArgumentOutOfRangeExceptionstartIndex表示不在此实例中的位置。

     

-OR -

     

lengthstartIndex小于零。

您的length值不小于零。您的startIndex值不小于零。这排除了第二种可能性。第一种可能性是lengthstartIndex表示不在字符串中的位置。您的length值为零,因此startIndexstartIndex等于length。因此,错误消息告诉您length指的是不在字符串中的位置。因此,length 超过字符串的长度。它不能更清楚。

答案 1 :(得分:2)

如果您不知道您的字符串是否实际包含子字符串的足够字符,则应使用StartsWith进行比较。

答案 2 :(得分:0)

上有例外
line.Substring(0, 3) != "***"

line.Substring(0, 5) != "CUSIP"

您所指的字符串位置不存在,可能是因为line值的长度小于预期值。

另一段代码可能是......

private void cmdProcess_Click(object sender, EventArgs e)
{
    foreach (string line in rtfMain.Lines)
    {
        if (!string.IsNullOrEmpty(line.Trim()) 
                        && !line.StartsWith("***") 
                        && !line.StartsWith("CUSIP"))
        {
            Quote q = new Quote();
            q.Parse(line);
            DisplayQuote(q);
            QuoteList.Add(q);
        }
    }
}

答案 3 :(得分:0)

我在附加代码中遇到了同样的问题 - 如果"行"""""字符串少于57个字符。它也不会对测试代码做出反应 - 代码来自我在VS的另一个并发实例中进行的测试项目,其中调试器执行捕获错误。如果我将代码放在主项目中的try-catch中,它确实会收到错误。

我曾经见过它,并怀疑它是Visual Studio中的一个错误(在这种情况下是2008 Pro - 不知道它是否会影响更高版本,只是升级到VS 2013和还没有看到它或者是由损坏的项目文件引起的。

        while (rf.Peek() >= 0)
        {
            line = rf.ReadLine().Trim();

            MessageBox.Show(line.Length.ToString());

            // test
            string x = "abc";
            string y = x.Substring(0, 20);
            // end test

            if (line.Substring(0, 57) == "<td align=\"right\" nowrap=\"nowrap\"><span       class=\"currency\">")
            {
                break;
            }

            // some more code 
        }