【发布时间】: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();