在做项目的时候,发现一个棘手的bug,特地本地还原现场一下
之前的
public static void such() {
TaRole taRole1 = new TaRole();
taRole1.setRoleName("角色名称1");
TaRole taRole2 = new TaRole();
taRole2.setRoleName("角色名称2");
TaRole taRole3 = new TaRole();
taRole3.setRoleName("角色名称3");
List<TaRole> taRoleLists = new ArrayList<>();
taRoleLists.add(taRole1);
taRoleLists.add(taRole2);
taRoleLists.add(taRole3);
Iterator<TaRole> it = taRoleLists.iterator();
while (it.hasNext()) {
//TaRole rolenext = it.next();
if ("角色名称1".equals(it.next().getRoleName())) {
it.remove();
}
if ("角色名称2".equals(it.next().getRoleName())) {
it.remove();
}
}
}
报错的原因是:某个interator出现了越界。在内部执行 iterator.next()方法,游标下移,已经指向最后一条数据,然后你非要在下面再来一次 iterator.next(); 游标继续下移,但是下面已经没有值了呀。
修改后
public static void such() {
TaRole taRole1 = new TaRole();
taRole1.setRoleName("角色名称1");
TaRole taRole2 = new TaRole();
taRole2.setRoleName("角色名称2");
TaRole taRole3 = new TaRole();
taRole3.setRoleName("角色名称3");
List<TaRole> taRoleLists = new ArrayList<>();
taRoleLists.add(taRole1);
taRoleLists.add(taRole2);
taRoleLists.add(taRole3);
Iterator<TaRole> it = taRoleLists.iterator();
while (it.hasNext()) {
TaRole rolenext = it.next();
if ("角色名称1".equals(rolenext.getRoleName())) {
it.remove();
}
if ("角色名称2".equals(rolenext.getRoleName())) {
it.remove();
}
}
}
改正对比
修改前

修改后

我点进去看了一下源码是这样翻译的,我扣了出来

总结,这是一个粗心的问题,它下一个都没有了,还点进去。就比如,你去买葱,店里就剩1个葱并且刚刚被买走了,你还一个劲儿的问老板,你还有没有葱,有个鸡毛。
如果博文中有什么不对的地方,请各位老鸟多多指教
本文介绍了一个关于Java中使用迭代器删除集合元素时出现的越界错误,并给出了正确的实现方式,强调了在使用迭代器时正确操作的重要性。
1920





