fold throws NPE when using parallel() variant on the collection
Arul Dhesiaseelan
aruld at acm.org
Sat Oct 20 01:44:57 PDT 2012
Hi,
This code used to work before, but it fails with build 61 and with the
latest sources. It works fine with stream, but not in parallel in the fold
context.
List<String> greetings = Arrays.asList("hello", "Hello");
List<Tweet> tweets = new ArrayList<>();
tweets.add(new Tweet("arul", "Aloha!", 2));
tweets.add(new Tweet("joe", "Hello!", 16));
tweets.add(new Tweet("matt", "Hola!", 78));
List<Tweet> filtered = tweets.parallel().filter(t ->
greetings.parallel().anyMatch(t.text::contains)).into(new
ArrayList<Tweet>());//greetings.parallel() works
List<Tweet> filtered2 = tweets.parallel().filter(tweet ->
greetings.parallel().fold(() -> false, (Boolean b, String keyword) -> b ||
tweet.text.contains(keyword), null)).into(new ArrayList<Tweet>());//
greetings.parallel() fails with NPE when used with fold()
Exception in thread "main" java.lang.NullPointerException
at java.util.streams.ops.FoldOp$ReduceTask.onCompletion(FoldOp.java:123)
at
java.util.concurrent.CountedCompleter.tryComplete(CountedCompleter.java:389)
at java.util.streams.ops.AbstractTask.compute(AbstractTask.java:101)
at java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:435)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:263)
at
java.util.concurrent.ForkJoinPool$WorkQueue.runSubtask(ForkJoinPool.java:994)
at
java.util.concurrent.ForkJoinPool.tryHelpStealer(ForkJoinPool.java:1704)
at java.util.concurrent.ForkJoinPool.awaitJoin(ForkJoinPool.java:1833)
at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:345)
at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:657)
at java.util.concurrent.ForkJoinPool.invoke(ForkJoinPool.java:2196)
at
java.util.streams.AbstractPipeline$ParallelImplPipelineHelper.invoke(AbstractPipeline.java:263)
at java.util.streams.ops.FoldOp.evaluateParallel(FoldOp.java:86)
at
java.util.streams.AbstractPipeline.evaluateParallel(AbstractPipeline.java:125)
at
java.util.streams.AbstractPipeline.evaluateParallel(AbstractPipeline.java:113)
at java.util.streams.AbstractPipeline.evaluate(AbstractPipeline.java:87)
at
java.util.streams.AbstractPipeline.pipeline(AbstractPipeline.java:298)
at java.util.streams.ValuePipeline.fold(ValuePipeline.java:189)
at FilterTest$2.test(FilterTest.java:25)
at FilterTest$2.test(FilterTest.java:1)
at java.util.streams.ops.FilterOp$1.accept(FilterOp.java:62)
at java.util.streams.Streams$ArraySpliterator.into(Streams.java:711)
at
java.util.streams.ParallelPipelineHelper.into(ParallelPipelineHelper.java:57)
at
java.util.streams.AbstractPipeline$ParallelImplPipelineHelper.into(AbstractPipeline.java)
at
java.util.streams.ops.TreeUtils$CollectorTask.doLeaf(TreeUtils.java:120)
at
java.util.streams.ops.TreeUtils$CollectorTask.doLeaf(TreeUtils.java:98)
at java.util.streams.ops.AbstractTask.compute(AbstractTask.java:100)
at java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:435)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:263)
at
java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975)
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1479)
at
java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104)
-Arul
More information about the lambda-dev
mailing list