2

我知道这个问题已经被问过好几次了,但我没有找到任何正确的答案。从 ConcurrentHashMap 获取结果时如何避免抛出 NullPointerException。我有下面的代码给我一个 NullPointer。

public static String getPersonInfo(String personAddress) {
    //if(concMap!=null && concMap.containsKey(personAddress))       
    return concMap.get(personAddress);  
            //return null;  
}

在并发哈希图中,我将人员 ID 和地址存储在并发哈希图中。在少数情况下,id 为空。尽管我在将数据放入地图之前进行了空检查,但在尝试读取数据时仍然出现以下错误。

java.lang.NullPointerException
at java.util.concurrent.ConcurrentHashMap.get(Unknown Source)

有人请帮忙:(我浪费了3个多小时试图调试这个。虽然我在网上看到很多帖子,但我还不太清楚可以做些什么来避免它。

4

5 回答 5

5

对 personAddress 进行空检查,调用 get(null) 会引发 NPE。它甚至在方法文档中指定

于 2013-09-11T08:33:20.630 回答
3

是空的,在这种情况下是(personAddress正如每个人都说的那样)。但是,检查它们是最安全的:

public static String getPersonInfo(String personAddress) {
  if (personAddress != null && concMap != null && concMap.containsKey(personAddress)) {       
    return concMap.get(personAddress);
  }
  return null;
}

我应该补充一点,除了原语之外,几乎所有东西都为 null 的能力是 Java 中一个常见的令人头疼的问题。大多数内部方法甚至都懒得处理它,只是抛出 NPE。如果某事不能在路上为空,请在您第一次有意义的机会时检查这一点。

于 2013-09-11T08:47:02.800 回答
1

这是不可能的。API声明,如果键为空,则此方法仅抛出 NPE。您应该在未执行空值检查的地方使用调试器。我也不明白,为什么您发布带有评论的代码。这意味着什么?那是你的空支票吗?为什么被注释掉了?

于 2013-09-11T08:35:13.730 回答
0

试试这个以避免从地图中获取空键:

public static String getPersonInfo(String personAddress) {
    //if(concMap!=null && concMap.containsKey(personAddress))       
    return (personAddress != null) ? concMap.get(personAddress) : null;  
}
于 2013-09-11T08:35:06.003 回答
0

如果您使用(或计划使用)JetBrains Idea,一个 Java IDE,您可以使用他们开发的一些特定注解。

基本上,你有@Nullable 和@NotNull。

于 2013-09-11T08:45:44.177 回答