尝试在 Java 列表上流式传输 ().filter().collect(Collectors.toList())) 时获取 NullPointerException
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/44158940/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Getting NullPointerException when trying to stream().filter().collect(Collectors.toList())) on Java list
提问by Elias Johannes
I got a problem while trying to search a specific Java object in a list.
Actually i got the search function i want working for another Java class. Now i tried it for a different one but instead of returning a list of results i get a NullPointerException.
尝试在列表中搜索特定 Java 对象时遇到问题。
实际上我得到了我想要为另一个 Java 类工作的搜索功能。现在我尝试了另一个不同的结果,但没有返回结果列表,而是得到了 NullPointerException。
This is how my function looks:
这是我的函数的外观:
public static List<Customer> searchByEverything(String keyword){
List<Customer> customerList = find.all(); //Using java Ebean
System.out.println(keyword); //Check if keyword is not empty
System.out.println(customerList); //Check if list is not empty
Predicate<Customer> customerPredicate = u -> u.name.toLowerCase().contains(keyword.toLowerCase());
try{
return customerList.stream().filter(customerPredicate).collect(Collectors.toList());
}catch (Exception e){
e.printStackTrace();
}
This is the strack trace from Exception e:
这是来自异常 e 的跟踪跟踪:
java.lang.NullPointerException
at models.Customer.lambda$searchByEverything(Customer.java:174)
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:174)
at java.util.ArrayList$Itr.forEachRemaining(ArrayList.java:891)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
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 models.Customer.searchByEverything(Customer.java:179)
at controllers.Application.searchCustomers(Application.java:262)
at router.Routes$$anonfun$routes$$anonfun$applyOrElse$$anonfun$apply.apply(Routes.scala:479)
at router.Routes$$anonfun$routes$$anonfun$applyOrElse$$anonfun$apply.apply(Routes.scala:479)
at play.core.routing.HandlerInvokerFactory$$anon.resultCall(HandlerInvoker.scala:157)
at play.core.routing.HandlerInvokerFactory$$anon.resultCall(HandlerInvoker.scala:156)
at play.core.routing.HandlerInvokerFactory$JavaActionInvokerFactory$$anon$$anon$$anon.invocation(HandlerInvoker.scala:136)
at play.core.j.JavaAction$$anon.call(JavaAction.scala:73)
at play.http.HttpRequestHandler.call(HttpRequestHandler.java:54)
at play.mvc.Security$AuthenticatedAction.call(Security.java:53)
at play.core.j.JavaAction$$anonfun.apply(JavaAction.scala:108)
at play.core.j.JavaAction$$anonfun.apply(JavaAction.scala:108)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1(Future.scala:24)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
at play.core.j.HttpExecutionContext$$anon.run(HttpExecutionContext.scala:56)
at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:70)
at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:48)
at scala.concurrent.impl.Future$.apply(Future.scala:31)
at scala.concurrent.Future$.apply(Future.scala:492)
at play.core.j.JavaAction.apply(JavaAction.scala:108)
at play.api.mvc.Action$$anonfun$apply$$anonfun$apply$$anonfun$apply.apply(Action.scala:112)
at play.api.mvc.Action$$anonfun$apply$$anonfun$apply$$anonfun$apply.apply(Action.scala:112)
at play.utils.Threads$.withContextClassLoader(Threads.scala:21)
at play.api.mvc.Action$$anonfun$apply$$anonfun$apply.apply(Action.scala:111)
at play.api.mvc.Action$$anonfun$apply$$anonfun$apply.apply(Action.scala:110)
at scala.Option.map(Option.scala:146)
at play.api.mvc.Action$$anonfun$apply.apply(Action.scala:110)
at play.api.mvc.Action$$anonfun$apply.apply(Action.scala:103)
at scala.concurrent.Future$$anonfun$flatMap.apply(Future.scala:251)
at scala.concurrent.Future$$anonfun$flatMap.apply(Future.scala:249)
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55)
at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run.apply$mcV$sp(BatchingExecutor.scala:91)
at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run.apply(BatchingExecutor.scala:91)
at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run.apply(BatchingExecutor.scala:91)
at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:72)
at akka.dispatch.BatchingExecutor$BlockableBatch.run(BatchingExecutor.scala:90)
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:39)
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:415)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
As i said, i have exactly the same search implemented for a different class and it works perfectly fine. Both customerList
and keyword
are not empty. The only difference between searching in my customerList
and the other list, is that it has around 4500 objects with around 50 attributes per object. Maybe that's the problem?
正如我所说,我为不同的类实现了完全相同的搜索,并且效果很好。双方customerList
并keyword
没有空。在我customerList
的列表和另一个列表中搜索之间的唯一区别是它有大约 4500 个对象,每个对象有大约 50 个属性。也许这就是问题所在?
Thank you in advance!
先感谢您!
回答by freedev
Very likely u.name
is null
很可能u.name
是null
Try to change your Predicate
in
尝试改变你Predicate
的
Predicate<Customer> customerPredicate = u -> (u.name != null && u.name.toLowerCase().contains(keyword.toLowerCase()));
To see what's the Customer instance that has name == null
, you could add a peek
method in your chain.
要查看具有 的 Customer 实例name == null
,您可以peek
在链中添加一个方法。
customerList.stream()
.peek(c -> {
if (c.name == null) {
// do something...
}
}).filter(customerPredicate).collect(Collectors.toList());