Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8 Lambda收集器抛出java.lang.ArrayIndexOutOfBoundsException_Java 8_Java Stream - Fatal编程技术网

Java 8 Lambda收集器抛出java.lang.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

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.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太好了!得到了。它是一样的。:)