解析xml时避免空指针激活

时间:2015-06-19 07:54:56

标签: java

这是我要解析的xml

<metadata>
    <groupId>org.chromium</groupId>
    <artifactId>chromedriver-win32</artifactId>
    <versioning>
        <release>2.14</release>
        <versions>
            <version>2.14</version>
        </versions>
        <lastUpdated>20150610112540</lastUpdated>
    </versioning>
</metadata>

当我尝试解析上面的XML时,即使我已经处理了空检查,我也得到了NullPointerException。以下是代码

private String getVersionFromNode(Element eElement) {
    String version = null;

    // Get the latest version
    String tagName = "latest";
    try {
        version = eElement.getElementsByTagName(tagName).item(0).getTextContent();
        // If latest version is not available take the release
        // version
        if ( version.isEmpty() ||  null == version || "null" == version) {
            tagName = "release";
            version = eElement.getElementsByTagName(tagName).item(0).getTextContent();
        }
    }
    catch (NullPointerException e) {
       System.out.println("not able to parse " + tagName + " tag " + e.getMessage());
    }

    return version;
}

当版本为null时,它应该在下面的块中输入。

if ( version.isEmpty() ||  null == version || "null" == version) {
    tagName = "release";
    version = eElement.getElementsByTagName(tagName).item(0).getTextContent();

}

这个问题应该解决什么问题?

3 个答案:

答案 0 :(得分:3)

您的String tagName"latest"并且在您的xml文件中,没有名为latest的元素,因此您的version仍为null,因此NullPointerException代码生成1}}:

version.isEmpty()  

在您的if声明中执行。因为versionnull。并且您的代码会尝试检查null是否为空。它不能。因此,此处生成NullPointerException

要处理这种情况,请先检查version是否为null。其次,检查字符串version是否等于字符串"null"。第三,检查它是否为空。因此,请改变if语句中的条件顺序:

if ( version.isEmpty() ||  null == version || "null" == version)  

if (null == version || "null" == version || version.isEmpty())  

顺便说一句,作为侧面提示,请使用:

"null".equals(version)  

而不是

"null" == version

答案 1 :(得分:2)

改变你的状况

if ( version.isEmpty() ||  null == version || "null" == version)

if (null == version || "null".equals(version) || version.isEmpty())

答案 2 :(得分:1)

将方法调用链接在一起时,每一步都会冒NullPointerException的风险。例如,在你的行

version = eElement.getElementsByTagName(tagName).item(0).getTextContent();

NullPointerException有4个机会:

  • 如果eElement为空,则尝试拨打getElementsByTagName(tagName)
  • 如果在tagName为空时调用getElementsByTagName(tagName)
  • 如果getElementsByTagName(tagName)返回null,则尝试调用item(0)
  • 如果item(0)返回null,则尝试调用getTextContent()

并非所有这些都可以在您的代码中使用,因为指定了tagName,但您应该始终小心。

您的问题的另一种方法是使用XPath

另见How to read XML using XPath in Java