为什么这段代码会报错呢?

为什么这段代码会报错呢?

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class CatTest {

	public static void main(String[] args) {
		// 定义宠物猫对象
		Cat huahua = new Cat("花花", 12, "英国短毛猫");
		Cat fanfan = new Cat("凡凡", 13, "中华田园猫");
		// 将宠物猫对象放入HashSet中
		Set<Cat> set = new HashSet<Cat>();
		set.add(huahua);
		set.add(fanfan);
		// 显示宠物猫信息
		Iterator<Cat> it = set.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}

		// 再添加一个与花花属性一样的猫
		Cat huahua01 = new Cat("花花", 12, "英国短毛猫");
		set.add(huahua01);
		System.out.println("******************************");
		System.out.println("添加重复数据后的宠物信息:");
		it = set.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}

		// 重新插入一个新宠物猫
		System.out.println("******************************");
		Cat huahua02 = new Cat("花花二代", 2, "英国短毛猫");
		set.add(huahua02);
		System.out.println("添加花花二代后的宠物猫信息:");
		it = set.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}

		System.out.println("******************************");
		// 在集合中查找花花的信息并输出
		if (set.contains(huahua)) {
			System.out.println("花花找到了!");
			System.out.println(huahua);
		} else {
			System.out.println("花花没找到!");
		}
		System.out.println("******************************");
		// 在集合中使用名字查找花花的信息
		System.out.println("通过名字查找花花信息");
		boolean flag = false;
		Cat c = null;
		it = set.iterator();
		while (it.hasNext()) {
			c = (Cat) it.next();
			if (c.getName().equals("花花")) {
				flag = true;
				break;
			}
		}
		if (flag) {
			System.out.println("花花找到了");
			System.out.println(c);
		} else {
			System.out.println("花花没找到");
		}

		// 删除花花二代的信息并重新输出
		for (Cat cat : set) {
			if ("花花二代".equals(cat.getName())) {
				set.remove(cat);
			}
		}
		System.out.println("******************************");
		System.out.println("删除花花二代后的数据:");
		for (Cat cat : set) {
			System.out.println(cat);
		}
	}
}


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

// 删除花花二代的信息并重新输出

        for (Cat cat : set) {

            if ("花花二代".equals(cat.getName())) {

                set.remove(cat);

            }

        }

你好!集合不允许在循环遍历时对集合元素进行删除。在上面的代码中,在循环中进行了集合元素的删除。如果删除的刚好是集合的最后一个元素,删除以后不再进行遍历了,那么此时就不会报错。如果删除的是中间的某个元素,删除之后还会接着遍历集合,那么就会报错。所以此处可以在set.remove(cat)后加上break

或者先进行查询,根据查询结果在循环外进行删除,就像查找花花的代码一样,如果flag为true就删除,否则给出错误提示。

祝学习愉快!

  • 盖沧海 提问者 #1
    Set<Cat> set1=new HashSet<Cat>(); for (Cat cat : set) { if (cat.getMonth()<5) { set1.add(cat); } set.removeAll(set1); } System.out.println("******************************"); System.out.println("删除花花二代后的数据:"); for (Cat cat : set) { System.out.println(cat); } 为什么这串代码也会报错呢?
    2018-01-08 16:17:49
  • 好帮手慕珊 回复 提问者 盖沧海 #2
    set.removeAll(set1);要写到for循环的外面
    2018-01-08 16:27:16
  • 盖沧海 提问者 #3
    非常感谢!
    2018-01-08 16:31:38
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师