为什么这个lambda会产生空指针异常?

时间:2015-11-08 20:04:53

标签: java lambda nullpointerexception java-stream

我第一次尝试使用流和lambda表达式:

Stream<TableType> myTTStream = Arrays.stream( T[source] ); // T[source] is a 1D row from a 2D array
    Optional<TableType> closest = myTTStream 
            .filter( tt -> !tt.visited ) // tt is each TableType object in the stream; select for unvisited
            .sorted( (tt1, tt2) -> Integer.compare(tt1.dist, tt2.dist) ) // sort them by distance to an output stream
            .findFirst() // get the first (lowest) distance (returns a possibly empty Optional describing the first element)
            ; 
    return ( !closest.isPresent() || closest.get().dist == Integer.MAX_VALUE ) ? -1 : closest.get().dist; // have to get the value from the Optional

代码从T [] []数组的一行创建一个流,过滤它为布尔被访问 false,对结果进行排序,并返回第一个(最低值)项流。它似乎工作,除非没有项目通过过滤器,在这种情况下,findFirst()导致错误最终导致空指针异常。

我不明白这一点,因为findFirst()返回一个Optional,根据文档,可能为空。所以有什么问题?如果它是由于sorted()方法被送入一个空流,那么为什么该行不会导致错误?

我很确定T数组中没有空元素。

堆栈跟踪(上面的代码是方法的主体“nearestUnvisited”;第238行是“.findFirst()”调用):

Exception in thread "main" java.lang.NullPointerException
at GraphM.lambda$0(GraphM.java:236)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
at java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958)
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)
at GraphM.closestUnvisited(GraphM.java:238)
at GraphM.findShortestPath(GraphM.java:167)
at GraphM.main(GraphM.java:343)

0 个答案:

没有答案