Java 'keys.nextElement()包含()上NPE的可能性`

Java 'keys.nextElement()包含()上NPE的可能性`,java,Java,如果System.out.println(keys.nextElement().contains(“Test”))行上发生NullPointerException以下代码中,可能的原因是什么 private void打印(地图){ 枚举键=Collections.Enumeration(map.keySet()); while(keys.hasMoreElements()){ System.out.println(keys.nextElement()包含(“Test”); } } 背景信息:Ha

如果
System.out.println(keys.nextElement().contains(“Test”))行上发生
NullPointerException
以下代码中,可能的原因是什么

private void打印(地图){
枚举键=Collections.Enumeration(map.keySet());
while(keys.hasMoreElements()){
System.out.println(keys.nextElement()包含(“Test”);
}
}

背景信息:
HashMap
允许
null
键()
HashTable
没有,但由于它是线程同步的,所以使用起来也(可能)较慢。因此,我建议您需要考虑代码中
null
键的可能性,或者避免将它们放在将传递给
print
的映射中,或者更改
print
来处理它们

您可以使用以下代码实现这一点:

    private void test() {
        Map<String, String> m = new HashMap<>();
        m.put(null, "Anything");
        print(m);
    }
private void test(){
Map m=新的HashMap();
m、 放(空,“任何”);
印刷品(m);
}
如果您可以运行调试器,那么就可以清楚地知道是哪个调用提供了NPE,如果不是,那么像这样拆分表达式有时会很有用

    private void print(Map<String, String> map) {
        Enumeration<String> keys = Collections.enumeration(map.keySet());
        while (keys.hasMoreElements()) {
            String nextElement = keys.nextElement();
            boolean contains = nextElement.contains("Test");
            System.out.println(contains);
        }
    }
private void打印(地图){
枚举键=Collections.Enumeration(map.keySet());
while(keys.hasMoreElements()){
字符串nextElement=keys.nextElement();
boolean contains=nextElement.contains(“测试”);
System.out.println(包含);
}
}

然后,您将看到触发异常的行。

键。nextElement()
可能为null要添加到上述注释中,
hasMoreElements()
告诉您是否存在下一个元素,但下一个元素可能为
null
本身。您要传递给Map的数据是什么?请检查
Map.containsKey(null)
-它表示map.put.Unknown上有一个bug IMHO,但日志表明这一行出现了NPE。为什么不在
循环时用if条件检查null呢?我不知道
HashMap
允许null键和
键。hasMoreElements()
是真的。。。非常感谢。