空指针异常 - 迭代FastMap值

时间:2012-04-16 14:16:42

标签: java collections map

我需要迭代FastMap.values。 我的问题是基本循环失败了NullPointerException

基本循环

Collection<Order> orders = myObject.getOpenOrders();
    for (Order order : orders) {
}

问题是我系统中的另一个线程编辑了fastmap 它正在添加和删除元素,我得到NullPointerException。 很少,但应该解决。

所以我添加了Null check

Collection<Order> orders = myObject.getOpenOrders();
   for (Order order : orders) {
        if (order != null ) 
   }

我仍然得到NullPointerExcetion 所以我尝试按如下方式迭代它

    FastMap<String, Order> openOrders = myObject.getOpenOrdersMap();
    for (FastMap.Entry<String, Order> e = openOrders.head(), end = openOrders.tail(); (e = e.getNext()) != end && e != null;) {
        Order order = e.getValue();
    }

但是当循环变为null而不是抛出NullPointerExcetion时循环停止。 这也是一个问题,因为我需要迭代所有元素。

我假设问题是for迭代使用values(),它实际上是指向列表的指针。 我试图复制列表,但我在复制过程中也得到了NullPointerExcetion。 任何建议

BTW:我知道改变整个设计是最好的解决方案,并在每个插入和读取中使用锁定。但是为了解决我的问题,我能做些什么小改动? 任何的想法?

2 个答案:

答案 0 :(得分:2)

如果你有一个多线程环境,你必须绝对使用一些同步,特别是在使用迭代器时。

当另一个线程正在编辑它时,你不能迭代一个集合,这会使迭代器失效并破坏所有东西。

因此吞下药丸并使用一些同步,这种情况需要它。

答案 1 :(得分:2)

这不是JDK类吗? (Javolution?) 从文档中说:

  

如果地图标记为共享,则所有操作都是线程安全的   包括迭代地图的集合

所以你可能会遇到一些并发问题? 试试这个:

FastMap<String, Order> openOrders = myObject.getOpenOrdersMap().shared()