java - 带有 iterator.next 的空指针

标签 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,但是此代码是否有可能在多线程环境中产生空指针?

最佳答案

某些集合允许您添加 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/

相关文章:

java - 如何在 LinkedHashMap 中获取当前元素的下一个元素?

java - 在 List 上调用 .sort 时出现 AbstractList UnsupportedOperationException

java - java类重载配置依赖的设计

java - 如何连接eclipse和docker

java - 编译错误: Can not convert boolean into an int

java - 在数组中使用循环和随机字符java

java - 使用 contains 来比较通用数组列表中的引用

java - JMS 临时队列丢弃第一条消息

collections - Java7中的集合中间操作库

java - 使用 equals() 的给定实现检查特定对象是否在列表中