我为StringIndexOutOfBoundsException
获得了setCharAt(int index, char ch)
:
StringBuilder word = new StringBuilder(4);
for(int i = 0; i < 4; i++)
word.setCharAt(i,'-');
StringBuilder(int capacity)
:构造一个字符串构建器,其中没有字符,并且容量参数指定了初始容量。
setCharAt(int index, char ch)
:指定索引处的字符设置为ch。
我唯一能想到的是没有分配内存,但那么StringBuilder(int capacity)
是什么意思?
答案 0 :(得分:6)
您正在使用的构造函数不会将任何数据放入StringBuilder中。
它仅指定StringBuilder的实际大小(我相信是为了提高性能)。
直到你实际把东西放在StringBuilder中,你的代码才会抛出异常。
请注意,您引用的文档明确说明了这一点:
“构建一个字符串生成器 NO CHARACTERS ... ”
答案 1 :(得分:4)
我唯一能想到的是没有分配内存,但那么StringBuilder(int capacity)的重点是什么?
重点是提供一个前期机会来分配足够大的内存块来处理将要插入的所有数据。当超出容量时,必须在内部分配新的内存块,并复制旧内存中的所有值。可以想象,如果多次出现,这可能会带来性能负担。
这种行为并非奇怪或意外,事实上它与封装的做法非常一致。
ArrayList
会做什么? ArrayList
由数组支持,并且使用足够的初始容量更具性能,但这样做仍然不允许任意访问数组的索引。
我认为奇怪的行为是将StringBuilder
视为char[]
的表示。表示被恰当地封装在其中,不要以奇怪的方式戳它。
答案 2 :(得分:3)
这似乎是StringBuilder
中的一种奇怪行为。
在AbstractStringBuilder
(它继承)中,构造函数定义为:
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
但是,在使用setCharAt()
时,我们会检查count
:
public void setCharAt(int index, char ch) {
if ((index < 0) || (index >= count))
throw new StringIndexOutOfBoundsException(index);
value[index] = ch;
}
因此,由于我们没有使用初始构造函数设置count
,因此我们的面部会抛出错误。
count
在append()
,replace()
,insert()
和setLength()
中重新定义。你可以solve your problem by also calling setLength(4)
;但是,as @jahroy pointed out,使用append()
更简单。