以下是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
,但是这个代码可能在多线程环境中产生空指针吗?
答案 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();
}