Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 爪哇语;“字符串索引超出范围”;例外_Java_String - Fatal编程技术网

Java 爪哇语;“字符串索引超出范围”;例外

Java 爪哇语;“字符串索引超出范围”;例外,java,string,Java,String,我写这个小函数只是为了练习,但是抛出了一个异常(“字符串索引超出范围:29”),我不知道为什么 (我知道这不是编写此函数的最佳方式,我可以使用正则表达式。) 代码如下: public String retString(String x) { int j=0; int i=0; StringBuffer y = new StringBuffer(x); try { while ( y.charAt(i) != '\0' ) { if

我写这个小函数只是为了练习,但是抛出了一个异常(“字符串索引超出范围: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字符串不是以null结尾的。使用
String.length()。使用
String.length()
确定停止的位置。

是否从其他语言翻译此代码?在字符串中循环,直到到达一个空字符(
“\0”
),但Java通常不在字符串中使用这些字符。在C语言中,这是可行的,但在您的情况下,您应该尝试一下

i < y.length()

此外

 y.setCharAt(j,'\0')
如果这是您所期望的,那么在代码末尾将不会调整字符串的大小。你应该试试看

y.setLength(j)

您正在从另一种语言翻译此代码吗?在字符串中循环,直到到达一个空字符(
“\0”
),但Java通常不在字符串中使用这些字符。在C语言中,这是可行的,但在您的情况下,您应该尝试一下

i < y.length()

此外

 y.setCharAt(j,'\0')
如果这是您所期望的,那么在代码末尾将不会调整字符串的大小。你应该试试看

y.setLength(j)

看起来您是一名C/C++程序员,即将加入java;)


一旦超出.charAt()的范围,它就不会达到null,而是达到StringIndexOutOfBoundsException。因此,在本例中,您将需要一个从0到y.length()的for循环。

看起来您是一个来到java的C/C++程序员;)

一旦超出.charAt()的范围,它就不会达到null,而是达到StringIndexOutOfBoundsException。因此,在本例中,您将需要一个从0到y.length()-1的for循环。

此异常是一个异常,但更具体地说,是一个异常(源自IndexOutOfBoundsException)。收到此类错误的原因是您超出了可索引集合的界限。这是C/C++所不做的(您可以手动检查集合的边界),而Java在其集合中内置了这些边界,以避免类似这样的问题。在本例中,您将使用字符串对象作为数组(可能是它在实现中的形式),并跨越字符串的边界

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

此异常是一个异常,但更具体地说,是一个异常(源自IndexOutOfBoundsException)。收到此类错误的原因是您超出了可索引集合的界限。这是C/C++所不做的(您可以手动检查集合的边界),而Java在其集合中内置了这些边界,以避免类似这样的问题。在本例中,您将使用字符串对象作为数组(可能是它在实现中的形式),并跨越字符串的边界


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

一个更好的实现(使用regex)就是
返回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是一个更快的实现(没有不必要的同步)

一个更好的实现(使用regex)就是
返回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是一种更快的实现(没有不必要的同步)

是的,这样做将使您的程序在+1.pst y.setLength(j)下完美运行;将调整stringYup的大小,这样做将使程序完美运行+1.pst y.setLength(j);将调整stringwow的大小,感谢您提供的这些信息,在我发布此函数之前(使用regex),我发现了一个很好的函数,但我想知道我的实现中出现了什么问题。但是谢谢你的详细回答!为了记录在案,while(y.charAt(i)=''行也不正确,它应该是while((i