Java Iterator迭代器remove元素 抛UnsupportedOperationException异常

309 阅读1分钟

仅记录一下日常工作中出现的问题 源代码如下:

public int getOrderOverdueDay(MallOrder mallOrder) {  
    // 业务代码 移除
    return calcMaxOverdueDay(Collections.singletonList(mallOrder));  
}

public int calcMaxOverdueDay(List<MallOrder> mallOrders) {
    // 业务代码 移除
    int maxOverdueDay = 0;  
  
    // 入参有地方使用的是Collections.singletonList 创建的List是内部的List,用到remove方法会报错  
    Iterator<MallOrder> iterator = mallOrders.iterator();  
    while (iterator.hasNext()) {  
        MallOrder element = iterator.next();  
        MallOrderSellPayType sellPayType = xx(element.getOrderCode());  
  
        if (sellPayType == null) {  
        log.warn("sellPayType表数据没创建:{}", element.getOrderCode());  
        iterator.remove();  
        continue;  
        }  
        if (sellPayType.getSellPayType() != 0) {  
        iterator.remove();  
        continue;  
        }  

        if (sellPayType.getIsTransfer() == 2) {  
        // 业务代码移除
        boolean inStore = xx(element.getOrderCode());  
        if (inStore) {  
        iterator.remove();  
            }  
        }  
    }  
}

iterator.remove();方法会抛出UnsupportedOperationException异常,是因为Collections.singletonList(mallOrder)生成的List是Collections的内部类 java.util.Collections.SingletonList,没有实现remove方法导致的。

解决的方案有在入参时改掉List的类型,或者在调用迭代器的时候重新new一个ArrayList 如下:

public int calcMaxOverdueDay(List<MallOrder> mallOrders) {
    // **
    // 重要代码
    Iterator<MallOrder> iterator = new ArrayList<>(mallOrders).iterator();
    // **
}

遇到一个问题,mallOrder的循环里面没有被处理,所以需要改一下引用

public int calcMaxOverdueDay(List<MallOrder> mallOrders) {
    // **
    // 重要代码
    mallOrders = new ArrayList<>(mallOrders);
    Iterator<MallOrder> iterator = mallOrders.iterator();
    // **
}