Java 带迭代器的Null指针。下一步

Java 带迭代器的Null指针。下一步,java,collections,Java,Collections,下面是一段java代码片段 Collection contextPages = (Collection) getContextPages(); Iterator contextPageIter = contextPages.iterator(); while (contextPageIter.hasNext()) { Page contextPage = (Page) contextPageIter.next(); String result = contextPage.getR

下面是一段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.
}
Collection contextPages=(Collection)getContextPages();
迭代器contextPageIter=contextPages.Iterator();
while(contextPageIter.hasNext()){
Page contextPage=(Page)contextPageIter.next();

String result=contextPage.getResult();//某些集合允许您添加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

试试这个-

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

通常,不允许同时修改集合。但是,不保证集合会检测到这一点(尽管)。这将有助于了解
contextPages
的确切类别。如果集合不是线程安全的,并且一个线程修改集合,而另一个线程使用迭代器进行集合,则可能会发生任何情况。您是否有理由怀疑另一个线程可能同时使用该集合?
Page contextPage = (Page) contextPageIter.next();
String result = null;
if(contextPage != null) {
        result = contextPage.getResult();
}