Javascript 调试Java stream()NullPointerException原因的最佳方法
在Java中,我有以下代码:Javascript 调试Java stream()NullPointerException原因的最佳方法,javascript,java,rest,stream,resttemplate,Javascript,Java,Rest,Stream,Resttemplate,在Java中,我有以下代码: return new RestTemplate().getForObject("https://images-api.nasa.gov/search?q=finger", CollectionWrapper.class) .getCollection() .getItems().stream() .map(Item::getLinks) .flatMap(List::stream) .filter(link-> "pre
return new RestTemplate().getForObject("https://images-api.nasa.gov/search?q=finger", CollectionWrapper.class)
.getCollection()
.getItems().stream()
.map(Item::getLinks)
.flatMap(List::stream)
.filter(link-> "preview".equals(link.getRel()))
.map(Link::getHref)
.collect(Collectors.toList());
它抛出一个NullPointerException,并显示以下错误消息:
java.lang.NullPointerException: null
at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:271) ~[na:na]
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) ~[na:na]
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1654) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na]
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[na:na]
at [... MyController.java]
我的问题
使用Java开发人员的常用工具调试此NPE原因的最佳/最简单/最快方法是什么
到目前为止,我的最佳解决方案
用JavaScript重写代码并在任何浏览器DevTools JS控制台中运行
fetch("https://images-api.nasa.gov/search?q=finger").then(data => data.json()).then(data => {
const result = data
.collection
.items
.map(item => item.links)
.flat()
.filter(link => link.rel === "preview")
.map(link => link.href)
console.log(result)
})
在Chrome的JS控制台中,这给了我
VM704:7 Uncaught (in promise) TypeError: Cannot read property 'rel' of undefined
at <anonymous>:7:22
at Array.filter (<anonymous>)
at <anonymous>:7:2
换句话说,我正在尝试访问筛选器中缺少的链接项的rel属性。如果我首先过滤掉所有没有链接的item元素,那么我的代码在Java和JavaScript中都能正常运行
但是如何在不复制和运行JavaScript代码的情况下快速找到原因呢 通常,您可以使用peek方法打印流或对流执行一些调试。它的工作方式与foreach类似,但它返回的是流而不是void。但实际上,每当您试图访问列表的元素时,您都应该声明列表不是空的,在您的情况下,您可以使用filter来过滤空列表。我不知道peek。非常感谢。您是否有一个具体的想法,如何以一种有用的方式使用它来调试我上面描述的那种情况?好吧,我认为您案例中的NPE来自这一行`.filterlink=>link.rel==preview。这肯定是因为链接为空。所以你可以添加peek`来打印任何空元素。很抱歉这么密集,但你能给我一个例子,说明如何使用peek打印空元素吗?