2012-04-16 50 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

如果你有一個多線程環境,你必須絕對使用一些同步,特別是在使用迭代器時。

當另一個線程正在編輯它時,您無法迭代集合,這會使迭代器失效並破壞所有內容。

因此吞下藥丸並使用一些同步,這種情況需要它。