下面是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
,但是此代码是否有可能在多线程环境中产生空指针?
最佳答案
某些集合允许您添加 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
引用,或者在使用 Iterator#next()
的结果之前检查是否有 null
>
Page contextPage = (Page) contextPageIter.next();
String result = null;
if(contextPage != null) {
result = contextPage.getResult();
}
单线程和多线程应用程序之间应该没有区别,只需确保不添加 null
即可。
关于java - 带有 iterator.next 的空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26127685/