使用String Builder获取错误“字符串索引超出范围:0”

所以这是我在Java中的代码(用于返回字符串的两半 – 一个是奇数半部分,从索引0开始,或者第一个字符,后半部分,从索引1或第二个字符开始):

public class StringTest{ public String halfOfString(String message, int start){ int length = message.length(); StringBuilder output = new StringBuilder(length); char ch; int i; if((start==0)||(start==1)){ for(i=start; i<message.length(); i=i+2){ ch = message.charAt(i); output.setCharAt(i,ch); // error occurs here } } return output.toString(); } public void testFunction(){ String s = "My name is Sid"; String first = halfOfString(s, 0); String second = halfOfString(s, 1); System.out.println("First half is " + first + " and second half is " + second); } } 

所以我的问题是 – 每当我尝试在BlueJ IDE上运行该程序时,它都不会,并在注释中提到的行上返回标题中的错误。

我在这个网站上倾注了一个类似的问题,这可能对我的错误有帮助,但我发现的所有问题都表明我已经实现了一个改变(在StringBuilder的setCharAt方法中,该人已经颠倒了i和ch参数) 。

是否与“输出”最初声明为空的事实有关,而setCharAt方法只能替换已经存在的字符? 任何帮助将不胜感激。

是否与“输出”最初声明为空的事实有关,而setCharAt方法只能替换已经存在的字符?

是的,这正是您收到此错误的原因。

请注意,正如您所做的那样,创建具有指定长度的StringBuilder

 StringBuilder output = new StringBuilder(length); 

不会创建一个已经有很多字符的StringBuilder – 它只是创建一个具有该内部缓冲区大小的StringBuilderStringBuilder本身仍然不包含任何字符,因此尝试设置第一个字符将导致您获得的exception。

调用StringBuilder上的append来添加字符而不是setCharAt

是否与“输出”最初声明为空的事实有关,而setCharAt方法只能替换已经存在的字符?

是的,这就是原因。

setCharAt的Javadoc很清楚:

index参数必须大于或等于0,并且小于此序列的长度

你为什么不在StringBuilder中使用append方法? 在我看来,如果你的代码可行,它会在StringBuilder中留下漏洞,因为你只设置其他所有字符而不是其中的字符。 使用append确保没有洞。