2014-07-20 18 views
0

我想从XML文件读取,但我得到一个空指针异常。 这是XML文件:nullpointerexception尝试从XML文件与DOM解析器读取

<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个。

+0

关于''在XmlReader.getTagValue(XmlReader.java:56)“' - 什么行是第56行?更重要的是,您需要了解如何调试NPE(NullPointerException)的一般概念。你应该仔细检查引发它的行(这里是你的XmlReader类的第56行),找出哪个变量为null,然后追溯到你的代码中,看看为什么。你会一次又一次遇到这些,相信我。 –

+0

里面:String getTagValue(String tag,Element element) 第56行是:if(node == null) – user2893825

+0

这行'if(node == null)'不能是引发异常的那一行。更可能的嫌疑犯是紧靠其上方的线路。重新运行你的程序来验证NPE被抛出的位置,因为这是关键。 –

回答

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(); 
} 
+0

我将其更改为 NodeList nodeList = element.getAttributeNode(tag).getChildNodes(); 感谢它的工作 – user2893825

+0

只需从'getTagValue'方法返回'element.getAttributeNode(tag).getValue()'。没有必要获得子节点。它应该是'element.getAttributeNode(tag).getValue()' – Braj

+0

尝试没有子节点,它失败 – user2893825

1

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

element.getAttribute(attributeName) 

其中attributeName是“id”或“isHidden”。这将以字符串的形式返回值,并且可以直接返回而无需进一步处理。

+0

你能举个例子吗? \t NodeList nodeList = element。的getAttribute(标签); does not; t – user2893825

+0

该调用将返回值作为一个字符串,所以你可以直接返回它,而不分配给一个nodeList。 –