先来看看StringBuillder的API:
getChars
public void getChars(int srcBegin,
int srcEnd,
char[] dst,
int dstBegin)将字符从此序列复制到目标字符数组 dst。要复制的第一个字符在索引 srcBegin 处;要复制的最后一个字符在索引 srcEnd-1 处。要复制的字符总数为 srcEnd-srcBegin。要复制到 dst 子数组的字符从索引 dstBegin 处开始,结束于以下索引:
dstbegin + (srcEnd-srcBegin) - 1
参数:
srcBegin - 从此偏移量处开始复制。
srcEnd - 在此偏移量处停止复制。
dst - 用来保存复制数据的数组。
dstBegin - dst 中的偏移量。
抛出:
NullPointerException - 如果 dst 为 null。
IndexOutOfBoundsException - 如果以下任意一项为 true:
srcBegin 为负
dstBegin 为负
srcBegin 参数大于 srcEnd 参数。
srcEnd 大于 this.length()。
dstBegin+srcEnd-srcBegin 大于 dst.length
从上面的API内容中我们可以清楚、明白的看到这个getChars的方法的作用。
sb.getChars(1,4,chs,1);这个语句,sb这个字符串可以当做一个数组来看,其中的数字相当于是脚标,从1到4,要复制的字符总数为 srcEnd-srcBegin。计算出来为3个字符,chs表示要复制到的目的char数组,是从脚标1开始的,所以数组的大小刚好能够容纳下得到的字符。
如果将这个语句改为 sb.getChars(1,4,chs, 2);那么将会抛出java.lang.ArrayIndexOutOfBoundsException的异常,
所以在设置目的字符数组的大小和起始位置的时候一定要注意这些细节性的问题,不然就会抛异常,如果胡乱的抛出异常,可能会导致数据的丢失。
建议你在遇到这种问题的时候先去查看一个API,然后这种问题自己就明白了,要养成勤看API的习惯,张孝祥老师不是说过,老师和我们的区别就是,老师熟悉一个问题的思路,以及懂的api比我们多,他们知道如何去查api |