最近在项目开发时遇到一个问题,就是写好的代码时不时的报出ArrayIndexOutOfBoundsException的异常,这让我很困扰。下面是那段代码的简化版,只是为了说明这个问题。
1、 代码及报错信息
代码如下:
import java.util.ArrayList;
import java.util.List;
/**
* 测试StringBuilder和StringBuffer在多线程情形下的不同表现
* 说明: StringBuilder是线程不安全的,但是效率较高
* StringBuffer是线程安全的,但是效率较低
* @author Herry
*/
public class StringContactTest {
public static void main(String[] args) {
// 测试StringBuilder拼接方式
for(int i=0; i < 20; i++) {
stringContactWithBuilder();
}
}
// 通过StringBuilder来进行字符串拼接
public static void stringContactWithBuilder(){
// 待拼接数据
List<String> dataList = new ArrayList<>();
// 模拟赋值
for (int i = 0; i < 20; i++) {
dataList.add("data" + i);
}
StringBuilder stringBuilder = new StringBuilder();
dataList.parallelStream().forEach(data -> {
stringBuilder.append(data);
StringBuilder stringBuilder2 = new StringBuilder();
dataList.parallelStream().forEach(data2 -> {
stringBuilder2.append(data2);
});
System.out.println(stringBuilder2.toString());
});
System.out.println(stringBuilder.toString());
}
}
报错信息如下:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.util.concurrent.ForkJoinTask.getThrowableException(Unknown Source)
at java.util.concurrent.ForkJoinTask.reportException(Unknown Source)
at java.util.concurrent.ForkJoinTask.invoke(Unknown Source)
at java.util.stream.ForEachOps$ForEachOp.evaluateParallel(Unknown Source)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evalua