抛出NullPointerException,但显然不是null

时间:2014-07-31 23:37:36

标签: java android nullpointerexception nodelist

我有这个方法,它在加载的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的行。

1 个答案:

答案 0 :(得分:3)

如果在

处出现NullPointerException
nLists.add(nList); // NullPointerException being thrown originates from this line

这意味着由于某种原因 nLists 为null,即使nList为null,也不会在那里抛出异常,因为JDK ArrayList实现允许null作为元素列表 但是如果那个代码块真的是那样的,那么你早先用

初始化了ArrayList只有2个语句
ArrayList<NodeList> nLists = new ArrayList<NodeList>();

你应该再次检查该行是否真的发生了异常。

否则只有初始化已经失败的可能性,因为例如类找不到异常或者......那样的。