为什么StringBuffer#append throws StringIndexOutOfBoundsException

时间:2016-02-11 08:53:29

标签: java multithreading concurrency stringbuffer

我有代码试图附加2个SttringBuffers:

logBuf.append(errStrBuf);

在日志中,我看到以下跟踪:

java.lang.StringIndexOutOfBoundsException: String index out of range: 90
    at java.lang.AbstractStringBuilder.getChars(AbstractStringBuilder.java:325)
    at java.lang.StringBuffer.getChars(StringBuffer.java:201)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:404)
    at java.lang.StringBuffer.append(StringBuffer.java:253)

我无法理解问题的原因。

你能举例说明常量吗?

它可以与并发相关吗?

你能提出解决方案吗?

2 个答案:

答案 0 :(得分:3)

是的,它可能与并发有关。根据{{​​3}}:

  

此方法在此(目标)对象上同步但不同步   同步源(sb)。

因此,如果在此过程中更改errStrBuf,则可能会产生此错误。自己同步,如下:

synchronize (errStrBuf) {
   logBuf.append(errStrBuf);
}

errStrBuf被更改的任何地方使用相同的同步块。

答案 1 :(得分:1)

围绕Java源代码展示了StringBuffer.append(StringBuffer sb) AbstractStringBuilder.append(StringBuffer sb)代表到 // Length of additional sb. int len = sb.length(); // Make sure there's room. ensureCapacityInternal(count + len); // Copy them through. sb.getChars(0, len, value, count); 这样做:

StringBuffer.getChars

AbstractStringBuilder代表再次getChars代表,public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) { if (srcBegin < 0) throw new StringIndexOutOfBoundsException(srcBegin); if ((srcEnd < 0) || (srcEnd > count)) throw new StringIndexOutOfBoundsException(srcEnd); if (srcBegin > srcEnd) throw new StringIndexOutOfBoundsException("srcBegin > srcEnd"); System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin); } 看起来有点像:

srcEnd > count

请注意,您的 String索引超出范围:90 因此必须是len返回true。因此,附加的字符串现在比传递的git remote add prv <url of prv.project.repository.bare> git fetch prv git checkout prv/<branch_name> -- project_1 短。很显然,它必须被另一个问题所打动。