2013-04-09 58 views
-3
读取XML时

我试图从这里贾乌德我的XML文件中获取的所有作者是XML代码空指针在Java中

<?xml version="1.0"?> 
<map> 
<authors> 
    <author>testasdas</author> 
    <author>Test</author> 
</authors> 
</map> 

下面是我在Java中使用

代码
public static List<String> getAuthors(Document doc) throws Exception { 
    List<String> authors = new ArrayList<String>(); 
    Element ed = doc.getDocumentElement(); 
    if (notExists(ed, "authors")) throw new Exception("No authors found"); 
    Node coreNode = doc.getElementsByTagName("authors").item(0); 
    if (coreNode.getNodeType() == Node.ELEMENT_NODE) { 
     Element coreElement = (Element) coreNode; 
     NodeList cores = coreElement.getChildNodes(); 
     for (int i = 0; i < cores.getLength(); i++) { 
      Node node = cores.item(i); 
      if (node.getNodeType() == Node.ELEMENT_NODE) { 
       Element e = (Element) node; 
       String author = e.getElementsByTagName("author").item(i).getTextContent(); 
       Bukkit.getServer().broadcastMessage("here"); 
       authors.add(author); 
      } 
     } 
    } 
    return authors; 
} 

我在尝试运行代码时遇到了java.lang.NullPointerException错误,但我不知道为什么。

09.04 17点05分24秒[服务器]重症在com.dcsoft.arenagames.map.XMLHandler.getMapData(XMLHandler.java:42)
09.04 17点05分24秒[服务器]重症在COM。 dcsoft.arenagames.map.XMLHandler.getAuthors(XMLHandler.java:73)
09.04 17时05分24秒[服务器]重症显示java.lang.NullPointerException

+1

完整的堆栈跟踪在哪里? – BobTheBuilder 2013-04-09 16:17:11

+0

'尝试.. catch' - >堆栈跟踪? – 2013-04-09 16:17:12

+2

这是XMLHandler.java的第73行吗? – 2013-04-09 16:20:52

回答

1

的问题是,你的代码索引<author>节点列表使用i,其中计数<authors>标记的所有孩子,其中一些不是<author>元素。当item(i)返回null时,当您尝试拨打getTextContent()时,您会收到NPE。你也不需要做所有的导航(这看起来很可疑,而且确实令人困惑)。试试这个:

public static List<String> getAuthors(Document doc) throws Exception { 
    List<String> authors = new ArrayList<String>(); 
    NodeList authorNodes = doc.getElementsByTagName("author"); 
    for (int i = 0; i < authorNodes.getLength(); i++) { 
     String author = authorNodes.item(i).getTextContent(); 
     Bukkit.getServer().broadcastMessage("here"); 
     authors.add(author); 
    } 
    return authors; 
} 
+0

这似乎是工作,但为什么我不必从顶部标签直接? – DCSoftware 2013-04-09 16:41:13

+0

@DCSoftware - 因为您可以直接从文档根目录收集所有''标签。当您为节点调用'getElementsByTagName'时,它将搜索以该节点为根的整个树,而不仅仅是子节点。 – 2013-04-09 16:53:21

1

要找到一个显示java.lang.NullPointerException的原因把一个断点异常发生,在这种情况下,73线,并调查该行的变量。

我的猜测是,在你的代码行:

String author = e.getElementsByTagName("author").item(i).getTextContent() 

变量eauthor元素,因此为什么e.getElementsByTagName("author")返回null

+0

如果'e'下没有''节点,'getElementsByTagName'不会返回'null';它会返回一个空的'NodeList'。问题是如果'i'超出范围,'item(i)'返回'null'。 – 2013-04-09 16:57:15

+0

当然,我认为结果是,原始代码是一团糟,你的清理版本是需要的。 – 2013-04-10 09:12:39