【发布时间】:2015-08-24 02:22:25
【问题描述】:
当我使用 Java 8 功能时,我在服务启动(创建 Bean)时收到 ArrayIndexOutOfBoundsException。
Java 8 已经设置好并且一直在工作。代码编译正确。在服务启动时,服务无法侦听端口,因为没有创建 bean。当我更改代码(删除 java 8 构造)时,服务启动并且一切正常。
这是我正在使用的代码(服务启动的工作代码):
for (Item itemObject : response) {
if (itemObject.hasId()) {
idList.add(String.valueOf(itemObject.Id());
}
}
使用 Java 8 构造的相同代码:
response.parallelStream()
.filter(itemObject -> itemObject.hasId())
.map(itemObject -> itemObject.getId())
.forEach(id -> idList.add(id));
包含这段代码的类的 bean 是使用组件扫描创建的。
以下是使用第二个代码块代替第一个代码块时的异常消息:
Exiting with throwable: java.lang.IllegalArgumentException: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [jar:file:/workspace/.../GetContainerIdForFcSkuAdapter.class]; nested exception is java.lang.ArrayIndexOutOfBoundsException: 51880
java.lang.IllegalArgumentException: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [jar:file:/workspace....Some.class]; nested exception is java.lang.ArrayIndexOutOfBoundsException: 51880
对我来说没有意义的是,为什么在创建 bean 时会覆盖函数内的代码(它不是 bean 类的构造函数)。我问这个,因为当我使用正常的 for 循环而不是并行流时,不存在异常。当调用函数并且实际使用此代码时,不应该出现ArrayOutOfBoundsException。
我该如何解决这个问题?
【问题讨论】:
-
什么是
idList?在第二个版本中,您使用的是parallelStream,因此您正在从多个线程将项目添加到此列表中。您使用的列表实现是线程安全的吗?如果您使用stream()而不是parallelStream(),错误会消失吗? -
另外,在列表中获取流内容的正常方法是
List<Something> list = stream.collect(Collectors.toList()),而不是stream.forEach(o -> list.add(o)。 -
我并不是真的从多个线程添加。 Java 在内部展开循环并进行并行化。使用蒸汽时仍然存在错误。就像我说的,代码块应该在调用函数时执行,而不是在创建 bean 时执行。如何使用此块并在服务启动时提供 ArrayIndexOutOfBounds。请在下面查看我的答案,并告诉我您是否认为这可能是一个原因
标签: java spring java-8 javabeans indexoutofboundsexception