我是编码的新手所以请指导我解决这个问题。我从用户设置输入字符串s并声明StringBuilder sb和整数类型变量consec
我在'if'条件下获得IndexOutOfBound
例外:
for (int i=0;i<s.length();i++) {
consec++;
if(s.charAt(i)!=s.charAt(i+1) || i+1>=s.length()) {
sb.append(s.charAt(i));
sb.append(consec);
consec=0;
}
}
答案 0 :(得分:3)
这是因为在你循环的最后一次迭代中,你正在访问不在数组中的元素(索引高于数组的大小),所以试试这个:
for(int i=0;i<s.length()-1;i++){ //<<See this
//your logic
}
当String的长度为偶数时,您需要在for
循环后明确地检查边缘大小写。例如,
for(int i=0;i<s.length()-1;i++){ //<<See this
//your logic
}
if(s.length()%2==0){
//your logic when length is even and loop has ignored last character.
}
答案 1 :(得分:1)
Java始终从左到右进行评估。所以这个:
s.charAt(i)!=s.charAt(i+1) || i+1>=s.length()
在检查s.charAt(i+1)
之前评估i+1>=s.length()
。当i+1 >= s.length()
时,s.charAt(i+1)
将失败,因为它超出了字符串的结尾。
反转操作数的顺序:
i+1>=s.length() || s.charAt(i)!=s.charAt(i+1)
因为||
是一个短路运算符,所以如果s.charAt(i)!=s.charAt(i+1)
为false,则仅评估i+1>=s.length()
,因此在这种情况下它不会失败并带有异常。
答案 2 :(得分:0)
考虑一个字符串,
String s = "abcd";
你的循环将从0开始 - &gt; s.length() - 1,即从0 - > 3
所以当你在索引3时,i+1=4
所以,s.charAt(i + 1)将抛出超出范围的异常,因为4高于数组索引。因此,要么从i -> 0 to i < s.length()-1
运行循环。或者将现有代码更改为以下内容:
for(int i=0;i<s.length();i++)
{
consec++;
if(i+1<s.length() && s.charAt(i)!=s.charAt(i+1))
{
sb.append(s.charAt(i));
sb.append(consec);
consec=0;
}
}