我想挑出以大写字母开头的字符串中的每个单词,但第3行出现数组越界错误;
foreach (string strWord in words)
{
if (Char.IsUpper(strWord[0]) && strWord.Length > 0)
{
Console.Write(strWord + " :: ");
}
}
感谢您的帮助
答案 0 :(得分:4)
交换参数,否则在检查之前它会崩溃:
if (strWord.Length > 0 && Char.IsUpper(strWord[0]))
答案 1 :(得分:2)
首先执行strWord.Length > 0
if (strWord.Length > 0 && Char.IsUpper(strWord[0]))
{
Console.Write(strWord + " :: ");
}
因此,在尝试获取首字母之前,您可以确保strWord
至少有一个字母。
答案 2 :(得分:1)
这里发生的是你首先检查strWord [0]的值而不首先确定单词中是否有任何字母,所以如果strWord的值为NULL,程序会抛出异常虽然索引0没有给定值,但是为了纠正这个问题,你应该首先检查单词的长度,然后检查字符strWord [0]是否为大写,如果字符串是如果条件在到达第二部分更正的代码1之前将被丢弃,则为NULL: -
if (strWord.Length > 0)
{
if(Char.IsUpper(strWord[0]))
{
Console.Write(strWord + " :: ");
}
}
更正后的代码2: -
if (strWord.Length > 0 && Char.IsUpper(strWord[0]))
{
Console.Write(strWord + " :: ");
}
答案 3 :(得分:1)
使用&&amp ;;时,请确保首先检查长度。运算符,因为参数是按顺序计算的。如果第一个参数失败,第二个参数将不会执行,并且当Length为0时,IsUpper会导致越界错误:
http://msdn.microsoft.com/en-us/library/2a723cdk.aspx
所以你只需要交换评估结果:
if (strWord.Length > 0 && Char.IsUpper(strWord[0]))
{
//etc
}
答案 4 :(得分:1)
&&
- 运算符是一个短路运算符,只有在返回已经false
时才会计算第一个条件。因此,如果您想要防止异常,这是正确的选择。但是你必须使用正确的顺序,首先检查可能失败的方法。
所以这样:
if (strWord.Length > 0 && Char.IsUpper(strWord[0]))
...
但是,您也可以使用这个简洁的LINQ查询:
var allWordsThatStartWithUpperCaseLetters = words
.Where(w => w.Length > 0 && Char.IsUpper(w[0]));
string result = string.Join(" :: ", allWordsThatStartWithUpperCaseLetters);