【问题标题】:Java - "String index out of range" exceptionJava - “字符串索引超出范围”异常
【发布时间】:2011-06-11 23:16:15
【问题描述】:

我写了这个小函数只是为了练习,但是抛出了一个异常(“字符串索引超出范围: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();


}

【问题讨论】:

    标签: java string


    【解决方案1】:

    您是从另一种语言翻译此代码吗?您正在遍历字符串,直到遇到空字符 ("\0"),但 Java 通常不会在字符串中使用这些字符。在 C 中,这会起作用,但在你的情况下,你应该尝试

    i < y.length()
    

    而不是

    y.charAt(i) != '\0'
    

    另外,

     y.setCharAt(j,'\0')
    

    如果这是您所期望的,则在您的代码末尾不会调整字符串的大小。你应该尝试

    y.setLength(j)
    

    【讨论】:

    • 是的,这样做会让你的程序完美运行 +1。
    • pst y.setLength(j);将调整字符串的大小
    【解决方案2】:

    此异常是 IndexOutOfBoundsException,但更具体而言,是 StringIndexOutOfBoundsException(派生自 IndexOutOfBoundsException)。收到此类错误的原因是您超出了可索引集合的范围。这是 C/C++ 不做的事情(您手动检查集合的边界),而 Java 将这些内置到他们的集合中以避免此类问题。在这种情况下,您使用的 String 对象就像一个数组(可能是它在实现中的样子)并越过了 String 的边界。

    Java 不会在 String 的公共接口中公开空终止符。换句话说,您无法通过搜索空终止符来确定字符串的结尾。相反,理想的方法是确保不超过字符串的长度。

    【讨论】:

      【解决方案3】:

      Java 字符串不是以空值结尾的。使用String.length() 确定停止的位置。

      【讨论】:

        【解决方案4】:

        看起来你是一名 C/C++ 程序员,开始接触 java ;)

        一旦你使用 .charAt() 超出范围,它不会达到 null,它会达到 StringIndexOutOfBoundsException。所以在这种情况下,你需要一个从 0 到 y.length()-1 的 for 循环。

        【讨论】:

          【解决方案5】:

          一个更好的实现(使用正则表达式)只是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
          

          顺便说一句,StringBuilder 是一个更快的实现(没有不必要的同步)

          【讨论】:

          • 哇,感谢您提供的信息,我在此处发布此功能(使用正则表达式)之前发现了很好的功能,但我想知道我的实现有什么问题。但是感谢您的详细回答!
          • 为了记录,while (y.charAt(i) == ' ') 这行也不正确,应该是 while ( (i
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-08-12
          • 2014-07-23
          • 1970-01-01
          • 1970-01-01
          • 2015-05-26
          • 1970-01-01
          相关资源
          最近更新 更多