为什么此Java代码为现有键值打印null?

时间:2013-11-04 22:04:39

标签: java collections nullpointerexception

此程序为现有键值返回null。

代码:

File file = new File("document.xml");
JAXBContext context = JAXBContext.newInstance(Document.class);
Unmarshaller unmarshaller=context.createUnmarshaller();
Document document=(Document)unmarshaller.unmarshal(file);

Map<String, String> map=document.getValues();
System.out.println("Values="+map);
System.out.println(map.get("100300IDG"));

输出: -

  Values={240400MAHAR=100010101, 100300IDG=44444444, 200200MDM=11221321, 341095TRAVERS=7070070, 340203BRUCKNER=545454, 490423SALEM=64845674, 100490MSC=2222222, 240371PRODUCTION=7777777, 250341FASTENAL=121212}

  null

文档类代码。

@XmlRootElement
public class Document {
private Map<String, String> values = new HashMap<String, String>();


//Getter and setter for values


}

包含值的文档文件和这些值将填充到文档对象中。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<document>
<values>
<entry>
    <key>240400MAHAR</key>
    <value>100010101</value>
</entry>
<entry>
    <key>100300IDG</key>
    <value>44444444</value>
</entry>
<entry>
    <key>200200MDM</key>
    <value>11221321</value>
</entry>
</values>
</document>

1 个答案:

答案 0 :(得分:4)

一种可能性是Map返回的document.getValues()中使用的Key对象打印String100300IDG,但实际上不是String个实例。因此map.get("100300IDG")String对象与非String对象进行比较(反之亦然)并返回null,因为找不到任何对象。

这完全取决于document.getValues()的实施方式。举个例子

private static Map<String, String> getValues() {
    Map map = new HashMap<>();
    map.put(new MyClass("100300IDG"), "44444444");
    return map;
} 
...
// with  
public class MyClass {
    private String string;

    public MyClass(String string) {
        this.string = string;
    }

    public String toString() {
        return string;
    }
}

会打印

{100300IDG=44444444}

但实际上并不包含密钥为"100300IDG"的条目。

确保您的密钥类型匹配。编译器在这里做不了多少。


或许另一个线程会删除打印和获取之间的条目。