【问题标题】:nullpointerexception while trying to read from xml file with dom parser尝试使用 dom 解析器从 xml 文件中读取时出现 nullpointerexception
【发布时间】:2014-07-20 19:28:54
【问题描述】:

我正在尝试从 xml 文件中读取,但我得到一个空指针异常。 这是xml文件:

<war>
    <missileLaunchers> 
        <launcher  id="L101" isHidden="false">
            <missile  id="M1" destination="Sderot" launchTime="2" flyTime="12" damage="1500"/>
            <missile id="M2" destination="Beer-Sheva" launchTime="5" flyTime="7" damage="2000"/>
        </launcher>
        <launcher id="L102" isHidden="true">
            <missile id="M3" destination="Ofakim" launchTime="4" flyTime="3" damage="5000"/>
            <missile id="M4" destination="Beer-Sheva" launchTime="9" flyTime="7" damage="1000"/>
        </launcher>
    </missileLaunchers>
    <missileDestructors >
        <destructor  id="D201">
            <destructdMissile  id="M1" destructAfterLaunch="4"/>
            <destructdMissile id="M3" destructAfterLaunch="7" />
            <destructdMissile id="M4" destructAfterLaunch="2"/>
        </destructor>
        <destructor id="D202">
            <destructdMissile id="M2" destructAfterLaunch="3"/>
        </destructor>
    </missileDestructors>
    <missileLauncherDestructors >
        <destructor type="plane" >
            <destructedLanucher  id="L101" destructTime="4"/>
        </destructor>
        <destructor type="ship">
            <destructedLanucher id="L102" destructTime="8" />
            <destructedLanucher id="L102" destructTime="12"/>
        </destructor>
    </missileLauncherDestructors>
</war>

这是代码:

public class XmlReader
{

File fXmlFile=null; 
DocumentBuilderFactory dbFactory=null;
DocumentBuilder dBuilder=null;
Document doc=null;

public XmlReader(String filePath) throws ClassNotFoundException
{
    if(filePath!=null)
    {
        this.fXmlFile = new File(filePath);     

        dbFactory = DocumentBuilderFactory.newInstance();
        try {
            dBuilder = dbFactory.newDocumentBuilder();
        } catch (ParserConfigurationException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        try {
            doc = dBuilder.parse(fXmlFile);
            doc.getDocumentElement().normalize();
        } catch (SAXException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    else System.out.println("Xml file not found");

}
//gets value by tag name
private static String getTagValue(String tag, Element element) {

    if(element.hasChildNodes())
    {
        NodeList nodeList = element.getElementsByTagName(tag).item(0).getChildNodes();          
        Node node = (Node) nodeList.item(0);
        if(node==null)
            return null;
        return node.getNodeValue();
    }

    else return element.getNodeValue();

}

//launcher
public List<Launcher> readLauncher() throws Exception
{           
    List<Launcher> launcherList = new ArrayList<Launcher>();
    try
    {
        NodeList nList = doc.getElementsByTagName("launcher");

        for(int i=0;i<nList.getLength();i++)
        {launcherList.add(getLauncher(nList.item(i)));}
    }

    catch (Exception e) 
    {
        e.printStackTrace();                
    }
    return launcherList;
}

//builds the object
private static Launcher getLauncher(Node node) 
{
    //XMLReaderDOM domReader = new XMLReaderDOM();
    Launcher launcher = new Launcher();
    if (node.getNodeType() == Node.ELEMENT_NODE)
    {
        Element element = (Element) node;                     
        //   launcher.setIsHidden(Boolean.parseBoolean(getTagValue("isHidden", element)));
        //   launcher.setId(getTagValue("id", element));
        System.out.println("id = "+getTagValue("id", element));
        System.out.println("ishidden = "+getTagValue("isHidden", element));     
    }

    return launcher;
 }
}

这是堆栈跟踪:

java.lang.NullPointerException
    at XmlReader.getTagValue(XmlReader.java:56)
    at XmlReader.getLauncher(XmlReader.java:96)
    at XmlReader.readLauncher(XmlReader.java:78)
    at Program.main(Program.java:27)

我无法更改 xml 文件的格式。 当它试图获取节点字段的实际值时,它似乎失败了,或者我假设。 虽然我不明白原因......当我检查节点列表的大小时,它变得很好,它确实给了我 2。

【问题讨论】:

  • 关于"at XmlReader.getTagValue(XmlReader.java:56)" -- 第 56 行是哪一行?更重要的是,您需要了解如何调试 NPE (NullPointerException) 的一般概念。您应该仔细检查抛出它的行(这里是您的 XmlReader 类的第 56 行),找出哪个变量为空,然后回溯到您的代码以查看原因。你会一次又一次地遇到这些,相信我。
  • inside: String getTagValue(String tag, Element element) line 56 is: if(node==null)
  • 这一行,if(node==null) 不能是抛出异常的那一行。更可能的嫌疑人是它正上方的线。重新运行您的程序以验证抛出 NPE 的位置,因为这是关键。
  • 重新运行并获得了一个新堆栈。 java.lang.NullPointerException 在 XmlReader.getTagValue(XmlReader.java:54) 在 XmlReader.getLauncher(XmlReader.java:94) 在 XmlReader.readLauncher(XmlReader.java:74) 在 Program.main(Program.java:27)
  • 如何在这个“添加评论框”中换行?总结一下:第 54、94、74、27 行。第 54 行是:NodeList nodeList = element.getElementsByTagName(tag).item(0).getChildNodes();

标签: java xml parsing dom


【解决方案1】:

问题出在下面一行:

 System.out.println("id = " + getTagValue("id", element));

getTagValue("id", element) 在哪里打电话

NodeList nodeList = element.getElementsByTagName(tag).item(0).getChildNodes();

这里element.getElementsByTagName("id") 将返回null

应该从属性中获取

// gets value by tag name
private static String getTagValue(String tag, Element element) {
    return element.getAttributeNode(tag).getValue();
}

【讨论】:

  • 我改成 NodeList nodeList = element.getAttributeNode(tag).getChildNodes();谢谢它的作品
  • 简单地从方法getTagValue返回element.getAttributeNode(tag).getValue()。无需获取子节点。应该是element.getAttributeNode(tag).getValue()
  • 什么是失败?再解释一下。你刚刚发布了一个新问题。这是否解决了这个新问题?
  • 不是新问题。对不起,你回复的太早了,我没有足够的时间来纠正。没关系,这是我的错。
【解决方案2】:

您正在 getTagValues 中调用 getElementsByTagName(),但是您正在尝试检索标签的属性。您可能需要改为调用 getAttribute()。例如:

element.getAttribute(attributeName)

其中attributeName 是“id”或“isHidden”。这会将值作为字符串返回,无需进一步处理即可直接返回。

【讨论】:

  • 你能给我举个例子吗? NodeList nodeList = element.getAttribute(tag);不工作
  • 该调用会将值作为字符串返回,因此您可以直接返回它而无需将其分配给节点列表。
猜你喜欢
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 2019-01-20
相关资源
最近更新 更多