Java - “字符串索引超出范围”异常

时间:2011-06-11 23:16:15

标签: java string

我为练习编写了这个小函数,但抛出异常(“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();


}

5 个答案:

答案 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是一种更快的实现(没有不必要的同步)