带有iterator.next的空指针

时间:2014-09-30 18:31:12

标签: java collections

以下是java中的代码片段。

Collection contextPages = (Collection) getContextPages();
Iterator contextPageIter = contextPages.iterator();
while (contextPageIter.hasNext()) {
    Page contextPage = (Page) contextPageIter.next();
    String result = contextPage.getResult();        // <-- Null pointer exception here
    // Other stuff which this API does.
}

此代码已经生产了一段时间。但出于某种原因,我们在String result = contextPage.getResult();处遇到了一个空指针。

即使我们检查了hasNext(),看起来也是如此,next()方法正在返回null

一种可能性是集合本身有一个null,但是这个代码可能在多线程环境中产生空指针吗?

2 个答案:

答案 0 :(得分:2)

某些集合允许您添加null,因此iter.next将返回它并在您使用它时 - > NPE

演示

@Test
public void testNull() {
    Collection<Object> c = new ArrayList<>();
    c.add(null);
    Iterator<Object> iterator = c.iterator();
    Assert.assertTrue(iterator.hasNext());
    Object o = iterator.next();
    Assert.assertNull(o);
}

因此,在使用null

的结果之前,请检查您是否未添加null对该集合的引用或检查Iterator#next()
Page contextPage = (Page) contextPageIter.next();
String result = null;
if(contextPage != null) {
        result = contextPage.getResult();
}

单线程和多线程应用程序之间应该没有区别,只需确保不添加null

答案 1 :(得分:0)

最好在使用Iterator.next()

的结果之前检查null

试试这个 -

Page contextPage = (Page) contextPageIter.next();
String result = null;
if(contextPage != null) {
        result = contextPage.getResult();
}