关于ZAKER 融媒体解决方案 合作 加入

java – 为什么这段代码不会导致 ConcurrentMo.

CocoaChina 09-19

参见英文答案 > Why is a ConcurrentModificationException thrown and how to debug it????????????????????????????????????6 个

我正在阅读有关 ConcurrentModificationException 以及如何避免它的内容 . 找到an article. 该文章中的第一个列表的代码类似于以下内容 , 这显然会导致异常:

List<String> myList = new ArrayList<String> ( ) ;myList.add ( "January" ) ;myList.add ( "February" ) ;myList.add ( "March" ) ;Iterator<String> it = myList.iterator ( ) ;while ( it.hasNext ( ) ) { String item = it.next ( ) ; if ( "February".equals ( item ) ) { myList.remove ( item ) ; }}for ( String item : myList ) { System.out.println ( item ) ;}

然后它继续解释如何用各种建议解决问题 .

当我试图重现它时 , 我没有得到例外!为什么我没有得到例外?

最佳答案

根据 Java API 文档Iterator.hasNext不会抛出 ConcurrentModificationException.

检查 "1 月 " 和 "2 月 " 后 , 从列表中删除一个元素 . 调用 it.hasNext ( ) 不会抛出 ConcurrentModificationException 但返回 false. 因此 , 您的代码干净利落地退出 . 但是从不检查最后一个 String. 如果将 "April" 添加到列表中 , 则会按预期获得 " 异常 ".

import java.util.List;import java.util.ArrayList;import java.util.Iterator;public class Main { public static void main ( String args [ ] ) { List<String> myList = new ArrayList<String> ( ) ; myList.add ( "January" ) ; myList.add ( "February" ) ; myList.add ( "March" ) ; myList.add ( "April" ) ; Iterator<String> it = myList.iterator ( ) ; while ( it.hasNext ( ) ) { String item = it.next ( ) ; System.out.println ( "Checking: " + item ) ; if ( "February".equals ( item ) ) { myList.remove ( item ) ; } } for ( String item : myList ) { System.out.println ( item ) ; } }}

http://ideone.com/VKhHWN

以上内容由"CocoaChina"上传发布 查看原文

觉得文章不错,微信扫描分享好友

扫码分享