ArgumentOutofBounds循环中ifs内的所有时间都会抛出异常。
在这段代码中,我试图在符号@ 2 @ 3之间发送两个字符串。
字符串1 + “@ 2 @ 3” +字符串2
现在我尝试通过方法substring将字符串与符号分开,但是在那里抛出异常......
public void seperatePMChattersNames(string TwoNames)
{
string nameOne="";
string nameTwo="";
Console.WriteLine(TwoNames);
for (int i = 0; i < TwoNames.Length; i++)
{
if (TwoNames[i] == '2' && TwoNames[i-1] == '@')///ArgumentOutofRange Exception
{
nameOne = TwoNames.Substring(0, i);
}
if (TwoNames[i] == '@' && TwoNames[i+1] == '3')///ArgumentOutofRange Exception
{
nameTwo = TwoNames.Substring(i+1, TwoNames.Length);
}
}
}
为什么会抛出它以及如何防止它?
答案 0 :(得分:1)
当i
为零时,TwoNames[i - 1]
将尝试访问字符串的索引-1 - 不存在。
当i
为TwoNames.Length - 1
时,TwoNames[i + 1]
将尝试访问字符串末尾。
接下来,当您 找到“@ 3”时,您正在使用:
TwoNames.Substring(i+1, TwoNames.Length)
Substring的第二个参数是要采用的子字符串的 length ,而不是最终索引。如果您只想要字符串的其余部分,则可以省略第二个参数:
TwoNames.Substring(i+1)
请注意,这包括“3” - 所以你可能真的想要i + 2而不是i + 1.
你有没有理由不使用string.IndexOf(TwoNames, "@2")
等?
如果你只想让nameOne
成为第一个“@ 2”之前的字符串而nameTwo
成为最后一个“@ 3”之后的字符串,你可以使用:
int endOfOne = TwoNames.IndexOf("@2");
if (endOfOne != -1)
{
nameOne = TwoNames.Substring(0, endOfOne);
}
else
{
// Couldn't find @2... throw exception perhaps?
}
int startOfTwo = TwoNames.LastIndexOf("@3");
if (startOfTwo != -1)
{
// Allow for the "@3" itself
nameTwo = TwoNames.Substring(startOfTwo + 2);
}
else
{
// Couldn't find @3... throw exception perhaps?
}
另一种选择是使用正则表达式 - 当然它们本身会增加一定程度的复杂性,但它们实际上是针对模式匹配的。如果你发现你需要获得更多的零碎,他们可以提供帮助。
答案 1 :(得分:1)
你的循环以i = 0开头但是在你的第一个if语句中你尝试访问试图访问TwoNames [-1]的TwoNames [i-1]。显然这会导致问题,因为没有TwoName [-1]。
你的循环应该从i = 1开始,而不是0。
答案 2 :(得分:0)
for (int i = 0; i < TwoNames.Length; i++)
应该是
for (int i = 1; i < TwoNames.Length-1; i++)
答案 3 :(得分:0)
这是答案
public void seperatePMChattersNames(string TwoNames)
{
Console.WriteLine(TwoNames);
int x = TwoNames.IndexOf("@2");
int y = TwoNames.IndexOf("@3");
string nameone = TwoNames.Substring(0, x);
string nametwo = TwoNames.Substring(y+2);
Console.WriteLine(nameone);
Console.WriteLine(nametwo);
}