2014-07-20 61 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。 –

相關問題