无法调用“java.util.Map.getOrDefault(Object, Object)”,因为 null

Cannot invoke "java.util.Map.getOrDefault(Object, Object)" because null

提问人:CoolCoder 提问时间:11/12/2023 最后编辑:Rifat Rubayatul IslamCoolCoder 更新时间:11/17/2023 访问量:58

问:

我无法从字典中访问值。我正在使用

double storedDistances = dictionary.getOrDefault(lnglat, Double.POSITIVE_INFINITY)

如果在字典中找不到匹配项,则返回正无穷大。我认为错误来自返回的字典值,我该如何编写捕获来阻止 null 值被转发?具体错误是null

Cannot invoke "java.util.Map.getOrDefault(Object, Object)" because "Planner.dictionary" is null.

将不胜感激。

我希望返回一个双精度值,以便稍后与另一个双精度值进行比较。但是对于未分配的字典条目,将返回 null,这不能分配给双精度值。

java 字典 null double

评论

0赞 Turing85 11/12/2023
javascript 标签信息:“[JavaScript] 与 Java 编程语言无关,只有表面上的相似之处。..."
0赞 Turing85 11/12/2023
请阅读:如何调试小程序(https://ericlippert.com/
0赞 Turing85 11/12/2023
"我认为错误来自返回null的字典值,..”- 我不确定我是否理解你。但我认为这本身就是.---“......我怎样才能写一个 catch 来阻止 null 值被结转?- 不要抓住s。找出该值的原因并修复它。--- 为了进行更彻底的分析,我们需要一个最小的可重复示例。请编辑帖子并添加一个最小的可重复示例dictionarynullNullPointerExceptionnull
1赞 Slaw 11/12/2023
可能的重复:什么是 NullPointerException,如何修复它?
0赞 Turing85 11/12/2023
@Slaw它只是“可能的重复”这一事实表明该帖子缺少(调试)信息:)

答:

1赞 Hugh Granger 11/16/2023 #1
Cannot invoke "java.util.Map.getOrDefault(Object, Object)" because "Planner.dictionary" is null.

Java 抱怨字典是 ,而不是返回。每当 上调用方法时,Java 虚拟机都会抛出 s。这就是在这种情况下发生的事情。nullnullNullPointerExceptionnull

1赞 Stephen C 11/16/2023 #2

我认为错误来自返回null的字典值

正确(可能......模制你令人困惑的术语)。它之所以发生,是因为变量的值为 。dictionarynull

(该变量不会“返回”任何内容。但是,如果您想说呼叫正在返回,那绝对是不正确的!getOrDefaultnull

如何编写 catch 来阻止 null 值被结转?

你不应该那样做!!

相反,你应该首先找到导致什么......并解决这个问题。dictionarynull

如果存在是你期望发生的事情(即这是一个“正常”事件),那么你应该在使用它之前测试它;例如dictionarynull

double storedDistances;
if (dictionary != null) {
    storedDistances = dictionary.getOrDefault(lnglat, Double.POSITIVE_INFINITY);
} else {
    storedDistances = // some other value
}

(实际上,这也不是最好的方法,更好的主意是将字典初始化为空映射而不是 null。这样,你就不需要特殊情况代码来处理空字典了。但我偏离了轨道。

发现意想不到的 NPE 正在掩盖裂缝。您需要修复导致裂缝发生的原因,以免在您睡觉时墙壁掉落在您的头上。


我们无法告诉您为什么是“正常”或是否“正常”,因为您的问题没有包含足够的上下文。dictionarynull