使用 Java 8 构造时 Bean 创建的 ArrayOutOfBoundsException
ArrayOutOfBoundsException on Bean creation while using Java 8 constructs
当我使用 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));
包含这段代码的 class 的 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 的构造函数 class)。我问这个,因为当我使用普通的 for 循环而不是并行流时,不存在异常。当调用函数并且实际使用此代码时,不应该出现ArrayOutOfBoundsException
。
我该如何解决这个问题?
您使用哪个版本的 Spring?您需要升级到 Spring 4 才能使用 Java 8 lambda 表达式。
我最近在使用 Spring 3.0.5 时发现了一个错误,该错误似乎已在 4.0.5 中修复。详情如下。
如果您有一个 class,它有一个参数化的构造函数并且还有一个使用 lambda 表达式的方法(在 Java 8 中引入),那么在为此创建一个 bean 时会发生 ArrayIndexOutOfException class.
当我使用 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));
包含这段代码的 class 的 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 的构造函数 class)。我问这个,因为当我使用普通的 for 循环而不是并行流时,不存在异常。当调用函数并且实际使用此代码时,不应该出现ArrayOutOfBoundsException
。
我该如何解决这个问题?
您使用哪个版本的 Spring?您需要升级到 Spring 4 才能使用 Java 8 lambda 表达式。
我最近在使用 Spring 3.0.5 时发现了一个错误,该错误似乎已在 4.0.5 中修复。详情如下。
如果您有一个 class,它有一个参数化的构造函数并且还有一个使用 lambda 表达式的方法(在 Java 8 中引入),那么在为此创建一个 bean 时会发生 ArrayIndexOutOfException class.