我有这个方法,它在加载的XML文档中按标签名称检索所有元素的NodeList
,该文档以InputStream
的形式给出。这是看起来像:
MainActivity.java
...
ArrayList<NodeList> nLists = new ArrayList<NodeList>();
NodeList nList = Helper.getNodeList(context.getAssets().open("feed.xml"), "item");
nLists.add(nList); // NullPointerException being thrown originates from this line
...
Helper.java
...
public static NodeList getNodeList(InputStream file, String nodeName) {
dbFactory = DocumentBuilderFactory.newInstance();
try {
dBuilder = dbFactory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
try {
Document doc = dBuilder.parse(file);
doc.getDocumentElement().normalize();
return doc.getElementsByTagName(nodeName);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
...
feed.xml
<data>
<item>
...
</item>
<item>
...
</item>
<item>
...
</item>
</data>
出于某种原因,在MainActivity.java上面标注的行上有一个NullPointerException
,但是如果我用try / catch块包围该行并继续脚本,那么一切正常,我可以毫无问题地使用NodeList。
所以我要问的是,当结果明显不为空时,为什么会抛出NullPointerException
?
好的,我尝试过,完全取消了ArrayList,并改为执行此操作(仅用于测试):
String s = Helper.getNodeList(context.getAssets().open("feed.xml"), "item").item(0).getNodeName();
Log.v("MainActivity", "" + s);
日志输出显示正确的节点名称(“item”)。但是,NPE仍然被定义为s
的行。
答案 0 :(得分:3)
如果在
处出现NullPointerExceptionnLists.add(nList); // NullPointerException being thrown originates from this line
这意味着由于某种原因 nLists 为null,即使nList为null,也不会在那里抛出异常,因为JDK ArrayList实现允许null作为元素列表 但是如果那个代码块真的是那样的,那么你早先用
初始化了ArrayList只有2个语句ArrayList<NodeList> nLists = new ArrayList<NodeList>();
你应该再次检查该行是否真的发生了异常。
否则只有初始化已经失败的可能性,因为例如类找不到异常或者......那样的。