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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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