2011-02-12 34 views
0

ArgumentOutofBounds在循环中的ifs内部一直抛出异常。需要帮助。 string.substring(0,max.Length)

在这段代码中,我试图在符号@ 2 @ 3之间发送两个字符串。

字符串1 +“@ 2 @ 3” +字符串2

现在我尝试通过该方法的子串从符号串分离出来,但一个例外被抛出那边......

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

@Dmitry Makovetskiyd你还没有发表评论在我的回答 – Student 2011-02-12 15:07:04

回答

1

i为零时,TwoNames[i - 1]将尝试访问字符串的索引-1 - 不存在。

iTwoNames.Length - 1,TwoNames[i + 1]将尝试访问过去的字符串末尾。

接下来,当你有发现“@ 3”,你使用:

TwoNames.Substring(i+1, TwoNames.Length) 

串的第二个参数是子字符串的长度走,而不是最终的指数。如果你只是想字符串的休息,可以忽略第二个参数:

TwoNames.Substring(i+1) 

注意,将包括“3”虽然 - 所以你可能真的想的I I + 2改为+ 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? 
} 

另一种选择是使用正则表达式 - 当然,它们本身会增加一定程度的复杂性,但它们确实是针对模式匹配。如果你发现你需要得到更多零碎的东西,他们可以提供帮助。

+0

是真实的,但只有当字符串以'2'开始或endis以'@'开始时,对吗? – jeroenh 2011-02-12 11:31:19

+0

@ jeroenh:是的,这是真的......但它仍然是一个合乎逻辑的失败,IMO。 – 2011-02-12 11:34:27

+0

当然你想要`TwoNames。子字符串(i + 2)`,而不是`i + 1` ... – Timwi 2011-02-12 11:44:06

1

您的循环以i = 0开头,但是在您尝试访问TwoNames [-1]时尝试访问TwoNames [i-1]的第一个if语句中。显然这会导致一个问题,因为没有TwoName [-1]。

你的循环应该与I = 1开始,不是0

0
for (int i = 0; i < TwoNames.Length; i++) 

应该

for (int i = 1; i < TwoNames.Length-1; i++) 
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); 
     }