gpt4 book ai didi

javascript - 调试 Java Stream() NullPointerException 原因的最佳方法

转载 作者:行者123 更新时间:2023-12-02 09:37:59 31 4
gpt4 key购买 nike

在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-> "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

换句话说,我正在尝试访问 filter() 内缺少的“link”项的“rel”属性。如果我首先过滤掉所有没有“链接”的“item”元素,我的代码在 Java 和 JavaScript 中都不会出现异常。

但是如何快速找到这个原因而不重复运行JavaScript代码呢?

最佳答案

一般情况下,您可以使用peek()方法在流上打印或执行一些调试。它的工作方式与foreach类似,但它返回Stream而不是void。但实际上,任何时候您尝试访问列表的元素时,都应该断言该列表不为空,在您的情况下,您可以使用 filter() 来过滤空列表。

关于javascript - 调试 Java Stream() NullPointerException 原因的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57342567/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com