首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么枚举通过集合抛出异常但循环遍历其项目却不会

枚举通过集合抛出异常但循环遍历其项目却不会的原因是,枚举(Enumeration)和集合(Collection)是两种不同的数据结构。枚举是一种顺序的数据结构,它可以通过索引访问其中的元素,而集合是一种无序的数据结构,它不能通过索引访问其中的元素。

当我们使用枚举遍历集合时,由于集合中的元素没有顺序,因此枚举不能保证按照特定的顺序遍历集合中的元素。因此,如果我们尝试使用枚举遍历集合,就会抛出异常,因为枚举无法确定集合中元素的顺序。

相比之下,循环遍历集合中的项目则不会抛出异常,因为它不需要按照特定的顺序遍历集合中的元素。它只需要遍历集合中的每个元素,而不需要考虑它们的顺序。

总之,枚举通过集合抛出异常的原因是,枚举需要按照特定的顺序遍历集合中的元素,而集合中的元素没有顺序。而循环遍历集合中的项目则不会抛出异常,因为它不需要考虑元素的顺序。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

你有没有掉进去过这些 Exception 的“陷阱“(Part C)

userList.remove(user); } } } } 在使用for循环进行遍历集合同时将符合条件的元素移出集合会报并发修改异常,也就是触发了Java...例如:当某一个线程A通过iterator去遍历集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast...要解决并发修改异常,可以使用迭代器进行遍历。...,直接在控制台输出异常信息 第二种方式可以使用for循环遍历的方式,遍历所有的枚举值,查看是否有符合条件的枚举值,但是for循环效率较低 第三种方式可以使用Guava,首先在pom.xml文件中导入guava...finally中抛出异常会抑制try中的异常,导致很难发现最初的异常

28610

21个Java Collections面试问答

6、为什么Map接口没有实现Collection接口? 尽管Map接口及其实现是Collections Framework的一部分,Map不是集合集合也不是Map。...但是,与Enumeration相比,Iterator安全得多,因为它始终拒绝其他线程修改被迭代的集合对象。 在Java Collections Framework中,迭代器代替了枚举。...12、有哪些不同的方法可以遍历列表? 我们可以通过两种不同的方式遍历列表-使用迭代器和使用for-each循环。...每个返回迭代器以进行遍历集合类都有自己的Iterator实现嵌套类。 这使集合类可以选择迭代器是fail-fast还是fail-safe的。...它广泛用于在JDK类,在集合框架java.util.Collections.UnmodifiableCollection抛出异常所有add和remove操作。

2K40
  • 重磅!!面试季--最新面试题总结出厂,附题解,后期持续分享!

    所以在循环遍历中,改变结构变化的方法,例如 add()、remove() 都会是 modCount 增长 1 ,而 expectedModCount 却不会变化。...为什么对倒数第二个元素进行删除不会报异常,而对其他位置的删除会报异常? 我们来看一下 ArrayList 中的内部类 Itr 。...实际上 modCount 的数值也增加了 1,只不过循环没发执行到那里,所以异常也就不会被抛出来了。...实现这个接口的集合是随机无序的,所以遍历的时候一般使用上述的 for,记住一点就可以了所有实现了 RandomAccess 接口的集合都是用一般 for 就可以了(可以通过 api 查看那些集合实现了...后者可以修改元素并且可以逆向遍历、定位当前索引位置,后者只能用于List及其子类型 11 快速失败和安全失败 fail-fast:遍历时对集合进行增删改会抛出Concurrent Modification

    35520

    一不小心就让Java开发者踩坑的fail-fast是个什么鬼?

    很多时候正是因为代码中抛出了CMException,很多程序员就会很困惑,明明自己的代码并没有在多线程环境中执行,为什么抛出这种并发有关的异常呢?这种情况在什么情况下才会抛出呢?...3 异常复现 在Java中, 如果在foreach 循环里对某些集合元素进行元素的 remove/add 操作的时候,就会触发fail-fast机制,进而抛出CMException。...expectedModCount表示这个迭代器预期该集合被修改的次数。值随着Itr被创建而初始化。只有通过迭代器对集合进行操作,该值才会改变。... 简单总结一下,之所以会抛出CMException异常,是因为我们的代码中使用了增强for循环,而在增强for循环中,集合遍历通过iterator进行的,但是元素的add/remove却是直接使用的集合类自己的方法...(因为fail-fast的主要目的就是识别并发,然后通过异常的方式通知用户) 但是,虽然基于拷贝内容的优点是避免了ConcurrentModificationException,同样地,迭代器并不能访问到修改后的内容

    88420

    .NET面试题系列 - IEnumerable

    实现了这个接口的类可以使用Foreach关键字进行迭代(迭代的意思是对于一个集合,可以逐一取出元素并遍历之)。实现这个接口必须实现方法GetEnumerator。...表示集合当前的元素,我们需要用它仅有的get方法取得当前元素 MoveNext方法根据Enumerator是否可以继续向后移动返回真或假 Reset方法将Enumerator移到集合的开头 通过上面的文字...此时,可以做个试验,如果我们知道一个集合有3个成员,故意迭代多几次,比如迭代10次,那么当集合已经到达尾部时,将会抛出InvalidOperationException异常。...而且,当for循环遍历超过集合大小时,不会抛出异常,Current会一直停留在集合的最后一个元素。...在迭代的过程中改变集合的状态 foreach迭代时不能直接更改集合成员的值,如果集合成员是类或者结构,则可以更改属性或字段的值。不能在为集合删除或者增加成员,这会出现运行时异常

    64520

    《编写高质量代码》学习笔记(2)

    (2)、Set:Set是不包含重复元素的集合,其主要实现类有:EnumSet、HashSet、TreeSet,其中EnumSet是枚举类型专用Set,所有元素都是枚举类型;HashSet是以哈希码决定元素位置的...首先对比一下两者的定义,枚举常量只需定义每个枚举项,不需要定义枚举值,而接口常量(或类常量)则必须定义值,否则编译不通过,即使我们不需要关注值是多少也必须定义;其次,虽然两者被引用的方式相同(都是 “...但是,一般常量在项目构建时就定义完毕了,很少会出现必须通过扩展才能实现业务逻辑的场景。 注意: 在项目中推荐使用枚举常量代替接口常量或类常量。...大家可能会问,为什么要使用枚举类型的工厂方法模式呢?...可能大家要问了,为什么Java的构造函数允许子类的构造函数抛出更广泛的异常类呢?

    1.7K40

    Java集合面试题&知识点总结(中篇)

    在 “Fail Safe” 机制下,当一个线程正在遍历集合的过程中,其他线程对集合进行修改,不会抛出 ConcurrentModificationException 异常。...因此,对原集合的修改不会影响到遍历操作,也就不会抛出 ConcurrentModificationException 异常。...那么正在遍历的线程可能会抛出这个异常。...使用 Iterator 删除集合中的元素更加安全,主要有以下两个原因: 避免并发修改异常:在使用 for-each 循环或者普通的 for 循环遍历集合的过程中,如果直接调用集合的 remove 方法删除元素...这是因为在遍历过程中,集合的结构发生了改变,但是这个改变并没有同步到正在进行的迭代过程中,所以会抛出异常

    22820

    ConcurrentModificationException异常解决办法

    原来在通过Iterator进行遍历的时候,如果直接对HashMap进行操作后,再继续用之前的Iterator进行遍历就会出现这个异常,表示HashMap已经被修改。...if (key.startsWith(sameKeyPart)) …{ caches.remove(key); } } 解决办法为通过相应的...一是直接对集合调用删除操作而不是在枚举器上。二是不同的线程试图对集合进行增删操作的时候。 这个解决办法的第一步就是同步代码,使得你在枚举的时候其它的线程不能增删记录。...或 Map 进行迭代操作过程中尝试直接修改 Collection / Map 的内容时,即使是在单线程下运行, java.util.ConcurrentModificationException 异常也将被抛出...有意思的是如果你的 Collection / Map 对象实际只有一个元素的时候, ConcurrentModificationException 异常并不会被抛出

    1K20

    这样规范写代码,同事直呼“666”

    () 才是更高效的做法,比先迭代keySet() 后再去通过get 取值性能更佳。...来检测是否为空在逻辑上没有问题,但是使用Collection.isEmpty() 使得代码更易读,并且可以获得更好的性能;除此之外,任何Collection.isEmpty() 实现的时间复杂度都是O(1) ,不需要多次循环遍历...反例: //在循环中拼接字符串反例 String str = ""; for (int i = 0; i < 10; i++){     //在循环中字符串拼接Java 不会对进行优化     str...用catch 语句捕获异常后,若什么也不进行处理,就只是让异常重新抛出,这跟不捕获异常的效果一样,可以删除这块代码或添加别的处理。...null 若程序运行返回null,需要调用方强制检测null,否则就会抛出空指针异常;返回空数组或空集合,有效地避免了调用方因为未检测null 而抛出空指针异常的情况,还可以删除调用方检测null 的语句使代码更简洁

    48900

    Java迭代器

    3.Iterator遍历时不可以删除集合中的元素问题   在使用Iterator的时候禁止对所遍历的容器进行改变大小结构的操作。...list.itertor()创建出来了,如果在迭代的过程中,又对list进行了改变容器大小的操作,那么Java就会给出异常。...expectedModCount) 40 throw new ConcurrentModificationException(); 41 } 42 }   通过查看源码发现原来检查并抛出异常的是...在ArrayList中Foreach时对集合的结构进行修改会出现异常: 上面我们说了实现了Iterable接口的类就可以通过Foreach遍历,那是因为foreach要依赖于Iterable接口返回的...所以同样的也会抛出异常,执行快速失败机制。   foreach是JDK1.5新增加的一个循环结构,foreach的出现是为了简化我们遍历集合的行为。

    51010

    当我遵循了这 16 条规范写代码,同事只对我说了三个字: 666

    () 才是更高效的做法,比先迭代keySet() 后再去通过get 取值性能更佳。...."); } 四、初始化集合时尽量指定大小 尽量在初始化时指定集合的大小,能有效减少集合的扩容次数,因为集合每次扩容的时间复杂度很可能时O(n),耗费时间和性能。...反例: //在循环中拼接字符串反例 String str = ""; for (int i = 0; i < 10; i++){ //在循环中字符串拼接Java 不会对进行优化 str +=...用catch 语句捕获异常后,若什么也不进行处理,就只是让异常重新抛出,这跟不捕获异常的效果一样,可以删除这块代码或添加别的处理。...失去精度 十三、返回空数组和集合而非 null 若程序运行返回null,需要调用方强制检测null,否则就会抛出空指针异常;返回空数组或空集合,有效地避免了调用方因为未检测null 而抛出空指针异常的情况

    52430

    16 条 yyds 的代码规范

    () 才是更高效的做法,比先迭代keySet() 后再去通过get 取值性能更佳。...来检测是否为空在逻辑上没有问题,但是使用Collection.isEmpty() 使得代码更易读,并且可以获得更好的性能;除此之外,任何Collection.isEmpty() 实现的时间复杂度都是O(1) ,不需要多次循环遍历...反例: //在循环中拼接字符串反例 String str = ""; for (int i = 0; i < 10; i++){ //在循环中字符串拼接Java 不会对进行优化 str +=...用catch 语句捕获异常后,若什么也不进行处理,就只是让异常重新抛出,这跟不捕获异常的效果一样,可以删除这块代码或添加别的处理。...失去精度 十三、返回空数组和集合而非 null 若程序运行返回null,需要调用方强制检测null,否则就会抛出空指针异常;返回空数组或空集合,有效地避免了调用方因为未检测null 而抛出空指针异常的情况

    42320

    规范 | 16条 yyds 的代码规范

    () 才是更高效的做法,比先迭代keySet() 后再去通过get 取值性能更佳。...."); } 四、初始化集合时尽量指定大小 尽量在初始化时指定集合的大小,能有效减少集合的扩容次数,因为集合每次扩容的时间复杂度很可能时O(n),耗费时间和性能。...反例: //在循环中拼接字符串反例 String str = ""; for (int i = 0; i < 10; i++){ //在循环中字符串拼接Java 不会对进行优化 str +=...用catch 语句捕获异常后,若什么也不进行处理,就只是让异常重新抛出,这跟不捕获异常的效果一样,可以删除这块代码或添加别的处理。...失去精度 十三、返回空数组和集合而非 null 若程序运行返回null,需要调用方强制检测null,否则就会抛出空指针异常;返回空数组或空集合,有效地避免了调用方因为未检测null 而抛出空指针异常的情况

    30100

    Java代码规范

    () 才是更高效的做法,比先迭代keySet() 后再去通过get 取值性能更佳。...来检测是否为空在逻辑上没有问题,但是使用Collection.isEmpty() 使得代码更易读,并且可以获得更好的性能;除此之外,任何Collection.isEmpty() 实现的时间复杂度都是O(1) ,不需要多次循环遍历...反例: //在循环中拼接字符串反例 String str = ""; for (int i = 0; i < 10; i++){ //在循环中字符串拼接Java 不会对进行优化 str +=...用catch 语句捕获异常后,若什么也不进行处理,就只是让异常重新抛出,这跟不捕获异常的效果一样,可以删除这块代码或添加别的处理。...null 若程序运行返回null,需要调用方强制检测null,否则就会抛出空指针异常;返回空数组或空集合,有效地避免了调用方因为未检测null 而抛出空指针异常的情况,还可以删除调用方检测null 的语句使代码更简洁

    1K20

    五年工作经验总结 16 条的代码规范

    () 才是更高效的做法,比先迭代keySet() 后再去通过get 取值性能更佳。...来检测是否为空在逻辑上没有问题,但是使用Collection.isEmpty() 使得代码更易读,并且可以获得更好的性能;除此之外,任何Collection.isEmpty() 实现的时间复杂度都是O(1) ,不需要多次循环遍历...反例: //在循环中拼接字符串反例 String str = ""; for (int i = 0; i < 10; i++){ //在循环中字符串拼接Java 不会对进行优化 str +=...用catch 语句捕获异常后,若什么也不进行处理,就只是让异常重新抛出,这跟不捕获异常的效果一样,可以删除这块代码或添加别的处理。...失去精度 十三、返回空数组和集合而非 null 若程序运行返回null,需要调用方强制检测null,否则就会抛出空指针异常;返回空数组或空集合,有效地避免了调用方因为未检测null 而抛出空指针异常的情况

    25830

    16 条 yyds 的代码规范

    () 才是更高效的做法,比先迭代keySet() 后再去通过get 取值性能更佳。...来检测是否为空在逻辑上没有问题,但是使用Collection.isEmpty() 使得代码更易读,并且可以获得更好的性能;除此之外,任何Collection.isEmpty() 实现的时间复杂度都是O(1) ,不需要多次循环遍历...反例: //在循环中拼接字符串反例 String str = ""; for (int i = 0; i < 10; i++){ //在循环中字符串拼接Java 不会对进行优化 str +=...用catch 语句捕获异常后,若什么也不进行处理,就只是让异常重新抛出,这跟不捕获异常的效果一样,可以删除这块代码或添加别的处理。...失去精度 十三、返回空数组和集合而非 null 若程序运行返回null,需要调用方强制检测null,否则就会抛出空指针异常;返回空数组或空集合,有效地避免了调用方因为未检测null 而抛出空指针异常的情况

    40130

    16 条 yyds 的代码规范

    () 才是更高效的做法,比先迭代keySet() 后再去通过get 取值性能更佳。...来检测是否为空在逻辑上没有问题,但是使用Collection.isEmpty() 使得代码更易读,并且可以获得更好的性能;除此之外,任何Collection.isEmpty() 实现的时间复杂度都是O(1) ,不需要多次循环遍历...反例: //在循环中拼接字符串反例 String str = ""; for (int i = 0; i < 10; i++){ //在循环中字符串拼接Java 不会对进行优化 str +=...用catch 语句捕获异常后,若什么也不进行处理,就只是让异常重新抛出,这跟不捕获异常的效果一样,可以删除这块代码或添加别的处理。...失去精度 十三、返回空数组和集合而非 null 若程序运行返回null,需要调用方强制检测null,否则就会抛出空指针异常;返回空数组或空集合,有效地避免了调用方因为未检测null 而抛出空指针异常的情况

    47620

    Java 面试知识点解析(四)——版本特性篇(1)

    集合变量可以是数组或实现了Iterable接口的集合类。 高级for循环和传统for循环的区别: 高级for循环在使用时,必须要明确被遍历的目标。...如果遍历数组,还需要对数组元素进行操作,建议用传统for循环因为可以定义角标通过角标操作元素。如果只为遍历获取,可以简化成高级for循环,它的出现为了简化书写。...比起普通的for循环,高级for循环还有性能优势,因为它对数组索引的边界值只计算一次(摘自《Effective Java》第46条)。 高级for循环可以遍历map集合吗?...上述两种观点可能会让你很疑惑,两者观点似乎构成了一种循环各有利弊。下面我们通过一个例子来理解这两者的区别。...5)改进的异常处理 在异常处理区域有几处改进。Java引入了多个catch功能,以使用单个抓到块捕获多个异常类型。 假设您有一个方法,它抛出三个异常

    1.9K60

    这样规范写代码,同事直呼“666”

    () 才是更高效的做法,比先迭代keySet() 后再去通过get 取值性能更佳。...来检测是否为空在逻辑上没有问题,但是使用Collection.isEmpty() 使得代码更易读,并且可以获得更好的性能;除此之外,任何Collection.isEmpty() 实现的时间复杂度都是O(1) ,不需要多次循环遍历...反例: //在循环中拼接字符串反例 String str = ""; for (int i = 0; i < 10; i++){ //在循环中字符串拼接Java 不会对进行优化 str...用catch 语句捕获异常后,若什么也不进行处理,就只是让异常重新抛出,这跟不捕获异常的效果一样,可以删除这块代码或添加别的处理。...null 若程序运行返回null,需要调用方强制检测null,否则就会抛出空指针异常;返回空数组或空集合,有效地避免了调用方因为未检测null 而抛出空指针异常的情况,还可以删除调用方检测null 的语句使代码更简洁

    59910

    这样规范写代码,同事直呼“666”

    () 才是更高效的做法,比先迭代keySet() 后再去通过get 取值性能更佳。...来检测是否为空在逻辑上没有问题,但是使用Collection.isEmpty() 使得代码更易读,并且可以获得更好的性能;除此之外,任何Collection.isEmpty() 实现的时间复杂度都是O(1) ,不需要多次循环遍历...反例: //在循环中拼接字符串反例 String str = ""; for (int i = 0; i < 10; i++){ //在循环中字符串拼接Java 不会对进行优化 str...用catch 语句捕获异常后,若什么也不进行处理,就只是让异常重新抛出,这跟不捕获异常的效果一样,可以删除这块代码或添加别的处理。...null 若程序运行返回null,需要调用方强制检测null,否则就会抛出空指针异常;返回空数组或空集合,有效地避免了调用方因为未检测null 而抛出空指针异常的情况,还可以删除调用方检测null 的语句使代码更简洁

    49220
    领券