java - spring-cloud-gateway:java.lang.IndexOutOfBoundsException
问题描述
当我使用 spring-cloud-gateway 时,产生以下错误:
2019-01-21 00:35:22.906 [reactor-http-server-epoll-6] ERROR org.springframework.boot.autoconfigure.web.reactive.error.DefaultErrorWebExceptionHandler - Failed to handle request [POST xxxxxxxxxxxxxxxx]java.lang.IndexOutOfBoundsException: Index: 1, Size: 5
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter.addWeightConfig(WeightCalculatorWebFilter.java:157)
at org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter.handle(WeightCalculatorWebFilter.java:117)
at org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter.onApplicationEvent(WeightCalculatorWebFilter.java:98)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:400)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:354)
at org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator.lookup(RouteDefinitionRouteLocator.java:224)
at org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator.combinePredicates(RouteDefinitionRouteLocator.java:200)
at org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator.convertToRoute(RouteDefinitionRouteLocator.java:127)
at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:100)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.drainLoop(FluxFlatMap.java:646)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.drain(FluxFlatMap.java:523)
at reactor.core.publisher.FluxFlatMap$FlatMapInner.onSubscribe(FluxFlatMap.java:897)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:128)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:61)
at reactor.core.publisher.Flux.subscribe(Flux.java:6873)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:372)
at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:232)
at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:190)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.onSubscribe(FluxFlatMap.java:332)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:128)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:61)
at reactor.core.publisher.FluxFlatMap.subscribe(FluxFlatMap.java:97)
at reactor.core.publisher.FluxMap.subscribe(FluxMap.java:62)
at reactor.core.publisher.FluxMap.subscribe(FluxMap.java:62)
at reactor.core.publisher.Flux.subscribe(Flux.java:6873)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:372)
at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:232)
at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:190)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.onSubscribe(FluxFlatMap.java:332)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:128)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:61)
at reactor.core.publisher.FluxFlatMap.subscribe(FluxFlatMap.java:97)
at reactor.core.publisher.MonoCollectList.subscribe(MonoCollectList.java:59)
at reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:59)
at reactor.core.publisher.MonoFlattenIterable.subscribe(MonoFlattenIterable.java:101)
at reactor.core.publisher.FluxMaterialize.subscribe(FluxMaterialize.java:40)
at reactor.core.publisher.MonoCollectList.subscribe(MonoCollectList.java:59)
at reactor.core.publisher.MonoPeekFuseable.subscribe(MonoPeekFuseable.java:74)
at reactor.core.publisher.MonoFlattenIterable.subscribe(MonoFlattenIterable.java:101)
at reactor.core.publisher.FluxDematerialize.subscribe(FluxDematerialize.java:39)
at reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:54)
at reactor.core.publisher.FluxConcatMap.subscribe(FluxConcatMap.java:121)
at reactor.core.publisher.MonoNext.subscribe(MonoNext.java:40)
这是问题源代码:
config.ranges.clear();
config.ranges.add(0.0);
List<Double> values = new ArrayList<>(config.normalizedWeights.values());
for (int i = 0; i < values.size(); i++) {
Double currentWeight = values.get(i);
Double previousRange = config.ranges.get(i);
Double range = previousRange + currentWeight;
config.ranges.add(range);
}
我想这可能是由于并发性,但我不知道这是怎么发生的。我想知道这是怎么发生的,或者还有其他可能的原因导致这个问题发生。
解决方案
这可能是因为Double previousRange = config.ranges.get(i);
当您第一次运行循环时该行i
等于 0。
config.ranges
当您要访问该列表的第一个元素时,请确保不为空。
在循环开始时,尝试记录或打印 的大小config.ranges
并将其与i
.
for (int i = 0; i < values.size(); i++) {
System.out.println(String.format("Size of config.ranges - %d", format.ranges.size()));
...
如果 的大小config.ranges
实际上是 0,那么您将需要更好的方法来实现您想要实现的任何内容。
推荐阅读
- javascript - JAVASCRIPT 自动完成文本输入值,由 excel 单元格数据生成的变量 | 跨浏览器 | 没有 ActiveX 对象
- python - 如何在 Django 中更新历史记录?
- python-3.x - 不明白 column_id 和 'direction' 在此仪表盘中的声明位置
- sql - 使用 Vue 和 SQLServer 在 v-data-table 中显示查找/关系数据
- r - 从 R 中的 data.frame 创建 JSON 对象的有效方法?
- sql - 将不同表中的列相乘
- javascript - 谷歌地图代码 dosent 将地图保存在屏幕上
- python - 管道上的 EOS 未执行
- angular - Angular 8 的 ngModel 解决方案
- python - 在 PyQt5 中的 HiDPI 显示器上使用 SVG 图标