Java 8 Lambda收集器抛出java.lang.ArrayIndexOutOfBoundsException
Lambda表达式在Impl.java类中间歇性抛出ArrayIndexOutOfBoundsException 堆栈跟踪:Java 8 Lambda收集器抛出java.lang.ArrayIndexOutOfBoundsException,java-8,java-stream,Java 8,Java Stream,Lambda表达式在Impl.java类中间歇性抛出ArrayIndexOutOfBoundsException 堆栈跟踪: java.lang.ArrayIndexOutOfBoundsException: 1 java.lang.ArrayIndexOutOfBoundsException: 1 at Impl.lambda$retrieve$0(Impl.java:124) ~[classes/:?] at java.util.stream.ReferencePipelin
java.lang.ArrayIndexOutOfBoundsException: 1 java.lang.ArrayIndexOutOfBoundsException: 1
at Impl.lambda$retrieve$0(Impl.java:124) ~[classes/:?]
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[?:1.8.0_181]
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382) ~[?:1.8.0_181]
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) ~[?:1.8.0_181]
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) ~[?:1.8.0_181]
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) ~[?:1.8.0_181]
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:1.8.0_181]
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) ~[?:1.8.0_181]
at Impl.retrieve(Impl.java:125) ~[classes/:?]
我已经编写了一个模拟该场景的示例程序。但是,在示例程序中,它是不可复制的。但是,有人能找出以下代码的任何问题吗
我已尝试使用空/非空输入。当我使numberStr抛出ArrayIndexOutOfBoundsException时,堆栈跟踪显示不同:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at LambdaTest.lambda$0(LambdaTest.java:13)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at LambdaTest.main(LambdaTest.java:14)
示例程序:
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.math3.util.Pair;
import com.google.common.collect.Lists;
public class LambdaTest {
public static void main(String[] args) {
String[] numberStr = { "one", "two", "three" };
List<Pair<String, SampleEnum>> result = getInputPairs().stream()
.map(entry -> new Pair<String, SampleEnum>(numberStr[entry.getFirst()], entry.getSecond()))
.collect(Collectors.toList()); // <=== similar to Impl.java:125
System.out.println("Lambda tested." + result.toString());
}
private static List<Pair<Integer, SampleEnum>> getInputPairs() {
List<Pair<Integer, SampleEnum>> pairs = Lists.newArrayList();
//pairs.add(new Pair<Integer, SampleEnum>(0, SampleEnum.ONE_AND_ONLY));
return pairs;
}
}
enum SampleEnum {
ONE_AND_ONLY
}
import java.util.List;
导入java.util.stream.collector;
导入org.apache.commons.math3.util.Pair;
导入com.google.common.collect.list;
公共类LambdaTest{
公共静态void main(字符串[]args){
字符串[]numberStr={“一”、“二”、“三”};
列表结果=getInputPairs().stream()
.map(条目->新对(numberStr[entry.getFirst()],entry.getSecond())
.collect(Collectors.toList());//看起来numberStr[entry.getFirst()]
正在抛出错误。在Impl
类中,numberStr
的元素太少。请使用调试器或将其放在.stream()
行之前查看发生了什么:
System.out.println("numberStr: " + Arrays.toString(numberStr));
和肖恩说的一样
java.lang.ArrayIndexOutOfBoundsException:1
此异常清楚地告诉,当从数组中获取第一个元素的数据时,它失败了
若要解决此问题,它应该可以正常工作。若要看得更清楚,请在numberStr上安装调试器,查看有多少元素,并检查从流中获取的元素数。若尝试访问数组中不可用的索引,则应看到此异常您认为“不同”是什么意思?这些堆栈跟踪看起来基本相同。保存lambda表达式主体的合成方法是否命名为LambdaTest.lambda$0
或Impl.lambda$retrieve$0
无关紧要。@Holger太好了!得到了。它是一样的。:)