2012-04-16 54 views
0

我需要迭代FastMap.values。 我的问题是基本环路故障转移NullPointerException异常空指针异常 - 遍历FastMap值

基本循环

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

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

所以我加空检查

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。 任何建议

顺便说一句:我知道改变整个设计是最好的解决方案,并在每个插入和读取使用锁。但是为了解决我的问题,是否可以做出一些较小的更改?
有什么想法?

+1

Javolution'FastMap'? IIRC,Javolution提出了各种疯狂的声明,但实施却显然是错误的。如果你真的需要并发集合,我建议'java.util.concurrent'。/NullPointerException应该包含触发位置的细节。 – 2012-04-16 14:58:41

回答

2

这不是JDK类吗? (?Javolution) 从什么医生说:

如果地图标记共享那么所有的操作都是线程安全的 包括在地图的收藏

所以,你可能会遇到一些并发迭代问题? 试一下:

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

+1

我不会相信Javolution的文档。 – 2012-04-16 14:59:35

+0

其值得给予的尝试...... – 2012-04-16 15:02:52

+0

@ TomHawtin-tackline你是对的,如果它被'共享',它会将自己有效地变成一个Hashtable,如果你问我(由于过度同步),速度不是很快。即便如此,在共享地图的put和get之间也没有发生关系,即它不是线程安全的。 – 2012-04-16 20:52:11

2

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

当另一个线程正在编辑它时,您无法迭代集合,这会使迭代器失效并破坏所有内容。

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