我需要迭代FastMap.values。
我的问题是基本循环无法通过NullPointerException进行故障转移
基本循环
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。
任何建议
顺便说一句:我知道更改整个设计是最好的解决方案,并且在每次插入和读取时都使用锁。但是为了解决我的问题,我可以做些更小的更改吗?
任何的想法?
最佳答案
这不是JDK类吗? (进化?)
从文档说:
如果映射标记为共享,则所有操作都是线程安全的
包括地图集合的迭代
那么您可能会遇到一些并发问题?
尝试:FastMap<String, Order> openOrders = myObject.getOpenOrdersMap().shared()