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

问题描述

| 我写这个小函数只是为了练习,但是抛出了异常(\“字符串索引超出范围: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是一个更快的实现(没有不必要的同步)     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...