List 在迭代时可能抛出的异常

简介:
今天在做小练习时遇到有关List在迭代时的一些小问题.写出与大家一起共享下吧..呵呵...

  ===================代码============================

public List getFavoriteBytag(String tagString) {
  Session session = HibernateSessionFactory.getSession();
  List list = null;
  // List resultList = null;
  String hqlString = "from Favorite";
  String[] tagStrings = null;
  Favorite favorite = null;
  try {
   list = commomDao.getList(hqlString);
   Iterator iterator = list.iterator();
   // resultList = new ArrayList();
   while (iterator.hasNext()) {
    favorite = (Favorite) iterator.next();
    /*
     * System.out.println(favorite.getFTags()); System.out.println("<br>");
     */
    tagStrings = favorite.getFTags().split(",");
    for (int i = 0; i < tagStrings.length; i++) {
     System.out.println(tagStrings
       + "===========================\n");
     if (tagString.equals(tagStrings)) {
      // resultList.add(favorite);
      list.add(favorite);
      System.out.println("haaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
      System.out.println("------------" + tagStrings
        + "--------------------");
     }
    }
   }
  } catch (RuntimeException e) {
   System.out
     .println("FavoriteSerachBizImpl.getFavoriteBytag()方法有错误!!!");
   e.printStackTrace();
   throw e;
  } finally {
   session.close();
  }
  // return resultList;
  return list;
}

先描述一下问题吧..
首先我把表favorite表中的所有数据全部查出放在了List集合中,然后调用List的iterator()方法把得到的结果又放到了Iterator集合中(为了好遍历呐.)当我遍历某一行时我把当前行的某列(String类型)通过String的split(",")把得到的这一列通","拆分成一个String的数组.在后我在遍历这个数组.如果这个数组中有与我传进来的参数(tagString)相同的话,我就把该行放到List集合中呐.由于我前后用的是同一个List,即(list)所以在运行该程序时抛出了java.util.ConcurrentModificationException这么个异常
...诶...惭愧呐...呵呵...

public class ConcurrentModificationExceptionextends RuntimeException当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。 
例如,某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不确定的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。执行该操作的迭代器称为快速失败 迭代器,因为迭代器很快就完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险。 
注意,此异常不会始终指出对象已经由不同 线程并发修改。如果单线程发出违反对象协定的方法调用序列,则该对象可能抛出此异常。例如,如果线程使用快速失败迭代器在 collection 上迭代时直接修改该 collection,则迭代器将抛出此异常。 

注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败操作会尽最大努力抛出 ConcurrentModificationException。因此,为提高此类操作的正确性而编写一个依赖于此异常的程序是错误的做法,正确做法是:ConcurrentModificationException 应该仅用于检测 bug。



本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2010/12/20/1911901.html,如需转载请自行联系原作者

目录
打赏
0
0
0
0
51
分享
相关文章
游戏服务器开服异常Check List
游戏服务器开服异常Check List
80 0
Python:list列表迭代使用range和enumerate获取元素和索引
Python:list列表迭代使用range和enumerate获取元素和索引
195 1
SpringBoot中@Value注解注入List或Map数据格式出现异常
在做一个小demo的时候、做的例子是我想在程序运行时将一些数据放入到配置类中的属性中、我想到可以通过yaml配置的数据映射到实体类中的属性中、我在想通过这种形式能不能映射。
一个关于List的IndexOutOfBoundsException异常记录
一个关于List的IndexOutOfBoundsException异常记录
135 0
解决Mysql5.7以上版本, 使用group by抛出Expression #1 of SELECT list is not in GROUP BY clause and contains no异常
解决Mysql5.7以上版本, 使用group by抛出Expression #1 of SELECT list is not in GROUP BY clause and contains no异常
163 0
避免list的并发修改异常的几种方式
避免list的并发修改异常的几种方式
有关使用Arrays.asList(array) 转换成List集合之后,对其进行操作抛出UnsupportedOperationException异常的问题
有关使用Arrays.asList(array) 转换成List集合之后,对其进行操作抛出UnsupportedOperationException异常的问题
129 0
JUC(二)JAVA线程池开启,等待全部执行完毕,配合计数器使用,List并发异常解决
JUC(二)JAVA线程池开启,等待全部执行完毕,配合计数器使用,List并发异常解决
JUC(二)JAVA线程池开启,等待全部执行完毕,配合计数器使用,List并发异常解决
【小家java】Java中集合List、Set、Map删除元素的方法大总结(避免ConcurrentModificationException异常)(下)
【小家java】Java中集合List、Set、Map删除元素的方法大总结(避免ConcurrentModificationException异常)(下)
【小家java】Java中集合List、Set、Map删除元素的方法大总结(避免ConcurrentModificationException异常)(下)
Jinja2迭代Python中的list列表和dict字典
Jinja2迭代Python中的list列表和dict字典
453 0
下一篇
oss创建bucket