问题描述
|
我写这个小函数只是为了练习,但是抛出了异常(\“字符串索引超出范围: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\"
),但Java通常不会在字符串中使用这些字符。在C中,这可以工作,但是在您的情况下,您应该尝试
i < y.length()
代替
y.charAt(i) != \'\\0\'
此外,
y.setCharAt(j,\'\\0\')
如果您期望的是,在代码末尾不会调整字符串的大小。您应该尝试
y.setLength(j)
, 此异常是IndexOutOfBoundsException,但更具体地说,是StringIndexOutOfBoundsException(从IndexOutOfBoundsException派生)。之所以收到这样的错误,是因为您超出了可索引集合的范围。这是C / C ++不会做的事情(您可以手动检查集合的范围),而Java已将它们内置在它们的集合中以避免此类问题。在这种情况下,您将String对象用作数组(可能是实现中的对象),并且遍历String的边界。
Java不会在String的公共接口中公开空终止符。换句话说,您无法通过搜索空终止符来确定String的结尾。相反,执行此操作的理想方法是确保不超过字符串的长度。
, Java字符串不是以Null结尾的。用String.length()
确定在哪里停下来。
, 看起来您是一位使用Java的C / C ++程序员;)
使用.charAt()超出范围后,它不会达到null,而是到达StringIndexOutOfBoundsException。因此,在这种情况下,您将需要一个从0到y.length()-1的for循环。
, 更好的实现(使用正则表达式)仅是ѭ7(甚至可以替代其他空白)
StringBuffer.length()
是恒定时间(Java中没有慢的null终止语义)
同样,ѭ9也会抛出ѭ10(不会像您在C语言中所期望的那样返回ѭ11)
对于固定代码:
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
顺便说一句,StringBuilder是一个更快的实现(没有不必要的同步)