Java 爪哇语;“字符串索引超出范围”;例外
我写这个小函数只是为了练习,但是抛出了一个异常(“字符串索引超出范围:29”),我不知道为什么 (我知道这不是编写此函数的最佳方式,我可以使用正则表达式。) 代码如下: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
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