我首先得到以下代码
带有以下错误消息
java.util.ConcurrentModificationException
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:894)
at java.util.HashMap$KeyIterator.next(HashMap.java:928)
at ca.on.oicr.pinery.lims.gsle.GsleClient.getOrders(GsleClient.java:720)
第720行是循环的第二个。
我得到的答案是我在一个循环中添加订单,循环遍历订单元素,这就是导致异常的原因。不要修改在循环内循环的集合。与样品一样。
所以我重新做了这个方法,但是收到以下错误信息:
java.util.NoSuchElementException
java.util.NoSuchElementException
at java.util.ArrayList$Itr.next(ArrayList.java:794)
at ca.on.oicr.pinery.lims.gsle.GsleClient.getOrders(GsleClient.java:730)
其中第730行是以下代码中的Set samples = sampleOrderMap.get(it.next(。。getId())
我如何修复此错误消息,并且这个新方法是否具有与原始方法相同的功能,但是我觉得拥有所有这些循环和条件语句都会导致它不起作用。
答案 0 :(得分:2)
我假设it
是Iterator
。 (我这样说是因为你没有发布重现这个的所有源代码,你将来应该这样做。)
因此,每次调用it.next()
时,都会推进迭代器。您在前四行中呼叫it.next()
三次。因此,如果Iterator
中只剩下一个项目,则对it.hasNext()
的初始调用将返回true,但您只能在用完项目之前再次调用it.next()
。< / p>
while (it.hasNext()) {
OrderSample nextSample = it.next();
// blah blah blah
// use nextSample instead of it.next() in each subsequence instance.
}
答案 1 :(得分:1)
在下面的代码片段中:
while (it.hasNext()) {
if (sampleOrderMap.containsKey((it.next().getId()))) { // calling it.next()
if (it.next().getId() != null) { // again calling it.next() ?
Set<OrderSample> samples = sampleOrderMap.get(it.next().getId()); //again calling
for (OrderSample orderSample : samples) {
Set<Attribute> attributes = attributeOrderMap.get(orderSample.getId());
////............ your code
在每次调用it.next()
时,您连续调用iterator.next()
,迭代器通过返回一个元素前进。虽然我不确定返回的对象it.next()
是什么,但您可以将其分配给集合类型的Object并在while
循环中使用它,如下所示:
while (it.hasNext()) {
Order order = (Order)it.next(); // if Order is your list's type
if (sampleOrderMap.containsKey((order.getId()))) {
if (order.getId() != null) {
Set<OrderSample> samples = sampleOrderMap.get(order.getId());
for (OrderSample orderSample : samples) {
Set<Attribute> attributes = attributeOrderMap.get(orderSample.getId());