我为练习编写了这个小函数,但抛出异常(“String index out of range:29”)并且我不知道为什么......
(我知道这不是编写此函数的最佳方法,我可以使用正则表达式。)
这是代码:
public String retString(String x)
{
int j=0;
int i=0;
StringBuffer y = new StringBuffer(x);
try
{
while ( y.charAt(i) != '\0' )
{
if (y.charAt(i) != ' ')
{
y.setCharAt(j, y.charAt(i));
i++;
j++;
}
else
{
y.setCharAt(j, y.charAt(i));
i++;
j++;
while (y.charAt(i) == ' ')
i++;
}
}
y.setCharAt(j,'\0');
}
finally
{
System.out.println("lalalalololo " );
}
return y.toString();
}
答案 0 :(得分:5)
您是否正在使用其他语言翻译此代码?您循环遍历字符串,直到到达空字符("\0"
),但Java通常不会在字符串中使用这些字符。在C中,这可行,但在您的情况下,您应该尝试
i < y.length()
而不是
y.charAt(i) != '\0'
此外,
y.setCharAt(j,'\0')
代码末尾的将不会调整字符串的大小,如果这是您所期望的。你应该尝试
y.setLength(j)
答案 1 :(得分:3)
此异常是IndexOutOfBoundsException,但更具体地说是StringIndexOutOfBoundsException(源自IndexOutOfBoundsException)。收到此类错误的原因是因为您超出了可索引集合的范围。这是C / C ++不能做的事情(你手动检查集合的边界),而Java将这些内置到它们的集合中以避免诸如此类的问题。在这种情况下,您使用String对象就像一个数组(可能是它在实现中的那个)并越过String的边界。
Java不会在String的公共接口中公开null终止符。换句话说,您无法通过搜索空终止符来确定String的结尾。相反,理想的方法是确保不超过字符串的长度。
答案 2 :(得分:2)
Java字符串不以空值终止。使用String.length()
确定停止的位置。
答案 3 :(得分:1)
看起来你是一名来自java的C / C ++程序员;)
一旦你用.charAt()超出范围,它就不会达到null,它会到达StringIndexOutOfBoundsException。所以在这种情况下,你需要一个从0到y.length() - 1的for循环。
答案 4 :(得分:1)
更好的实现(使用正则表达式)只是return y.replaceAll("\\s+"," ");
(这甚至取代了其他空格)
和StringBuffer.length()
是常量时间(java中没有慢速空终止语义)
同样x.charAt(x.length());
也会抛出StringIndexOutOfBoundsException
(而不是像C期望的那样返回\0
)
用于固定代码:
while ( y.length()>i)//use length from the buffer
{
if (y.charAt(i) != ' ')
{
y.setCharAt(j, y.charAt(i));
i++;
j++;
}
else
{
y.setCharAt(j, y.charAt(i));
i++;
j++;
while (y.charAt(i) == ' ')
i++;
}
}
y.setLength(j);//using setLength to actually set the length
btw StringBuilder是一种更快的实现(没有不必要的同步)