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

本文关键字:字符串 引用 位置 ArgumentOutOfRangeException 索引 System | 更新日期: 2023-09-27 18:22:02

当我在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

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

阅读错误消息。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) System.String.Substring(Int32 startIndex, Int32 length)

清楚不过了,您传递给String.Substringlength论点存在问题。从文档中:

异常

ArgumentOutOfRangeException

startIndexlength表示不在此实例中的仓位。

-或-

startIndexlength小于零。

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

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

例外是说你在

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);
        }
    }
}

我对附加的代码有同样的问题 - 如果"行"字符串少于 57 个字符,VS 不会捕获错误。它也不会对测试代码做出反应 - 该代码来自我在另一个 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 
        }