尝试在 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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 07:59:57  来源:igfitidea点击:

Getting NullPointerException when trying to stream().filter().collect(Collectors.toList())) on Java list

javalistlambdanullpointerexceptionebean

提问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 customerListand keywordare not empty. The only difference between searching in my customerListand the other list, is that it has around 4500 objects with around 50 attributes per object. Maybe that's the problem?

正如我所说,我为不同的类实现了完全相同的搜索,并且效果很好。双方customerListkeyword没有空。在我customerList的列表和另一个列表中搜索之间的唯一区别是它有大约 4500 个对象,每个对象有大约 50 个属性。也许这就是问题所在?

Thank you in advance!

先感谢您!

回答by freedev

Very likely u.nameis null

很可能u.namenull

Try to change your Predicatein

尝试改变你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 peekmethod in your chain.

要查看具有 的 Customer 实例name == null,您可以peek在链中添加一个方法。

customerList.stream()
.peek(c -> { 
   if (c.name == null) {
      // do something...
   }
}).filter(customerPredicate).collect(Collectors.toList());