读取XML文件时出现Java NullPointerException

时间:2013-11-25 18:23:32

标签: java xml url nullpointerexception

我正在尝试从URL读取此XML文件:

<updates>
    <plugin name="PluginName">
        <latest>0.7</latest>
        <url>[PLUGIN URL]</url>
        <notes>
            [UPDATE NOTES]
        </notes>
        <message/>
    </plugin>
</updates>

这是我阅读文档的Java代码:

private Document getXML(){

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

    dbf.setIgnoringElementContentWhitespace(true);

    Document doc = null;
    try {
        DocumentBuilder db = dbf.newDocumentBuilder();
        try {
            doc = db.parse(new URL(XML_URL).openStream());
            System.out.println("Successfully read XML from URL");
            return doc;
        } catch (MalformedURLException e) {
            log(Level.SEVERE, "Update URL was borked");
            e.printStackTrace();
        } catch (SAXException e) {
            log(Level.SEVERE, "I don't even know what happened here");
            e.printStackTrace();
        } catch (IOException e) {
            log(Level.SEVERE, "Something in your connection broke");
            e.printStackTrace();
        }
    } catch (ParserConfigurationException e) {
        log(Level.SEVERE, "Unable to create Parsing Document, complain to developers");
        e.printStackTrace();
    }

    return doc;

}

然后将此方法返回的Document对象传递给解析它的方法:

private double extractVersion(Document doc){

    Node pluginsNode = doc.getFirstChild();
    Node pluginNode = pluginsNode.getFirstChild();

    while(pluginNode.hasAttributes() && !pluginNode.getAttributes().getNamedItem("name").equals(PLUGIN_NAME)){
        pluginNode = pluginNode.getNextSibling();
    }

    Node child = pluginNode.getFirstChild();
    System.out.println("Child: "+child);
    System.out.println("Pnode:" + pluginNode);
    while (!child.getNodeName().equals("latest")){
        child = child.getNextSibling();
        if(child == null){
            System.out.println("SOMETHING HAPPENED");
        }
    }

    String latest = child.getFirstChild().getNodeValue();

    return Double.parseDouble(latest);
}

每当我运行代码时,我最终都会从此行获取空指针异常:

while (!child.getNodeName().equals("latest")){

我已经改变了几个小时的东西,并试图在别处获得帮助,但我无法弄清楚发生了什么以及为什么我得到一个空指针异常。

2 个答案:

答案 0 :(得分:1)

尝试使用getTextContent()代替getNodeName()。看看是否有帮助。

getNodeName()只根据节点的类型返回String,而不是其内容。

修改

尝试

while (child != null && !child.getNodeName().equals("latest")) {
    child = child.getNextSibling();
}

编辑

以上所有都不起作用。

我认为真正的问题在于:

Node pluginsNode = doc.getFirstChild();

尝试将其替换为:

Node pluginsNode = (Node)doc.getDocumentElement();

根据this问题。

修改

经过一些调试后,这是解决方案:

private double extractVersion(Document doc){

String result = "";

NodeList nodeList = doc.getElementsByTagName("latest");
for (int i = 0; i < nodeList.getLength(); i++) {
    Node node = nodeList.item(i);
    if (node.getNodeName().equals("latest")) {
        result = node.getTextContent();
    }
}

return Double.parseDouble(result);
}

答案 1 :(得分:0)

我想当你到达最后一个节点并且根本就没有下一个sibiling时会发生这种情况。根据文件http://docs.oracle.com/javase/1.5.0/docs/api/org/w3c/dom/Node.html#getNextSibling() getNextSibiling和getFirstSibiling可能返回null。您应该检查此调用返回的子项是否为空