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
阅读错误消息。1 其中之一
line.Substring(0, 3) != "***"
或
line.Substring(0, 5) != "CUSIP"
不好,因为line
的长度分别小于三或五。此外,请为此目的使用String.StartsWith
。
1:错误消息实际上是在向您尖叫:
再
System.ArgumentOutOfRangeException
:Index
和length
必须引用字符串中的一个位置。参数名称:length
System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)
System.String.Substring(Int32 startIndex, Int32 length)
清楚不过了,您传递给String.Substring
的length
论点存在问题。从文档中:
异常
ArgumentOutOfRangeException
startIndex
加length
表示不在此实例中的仓位。-或-
startIndex
或length
小于零。
您的startIndex
值不小于零。您的length
值不小于零。这排除了第二种可能性。第一种可能性是startIndex
加length
表示不在字符串内的位置。您的startIndex
值为零,因此startIndex
加length
等于 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
}