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。

原文地址:https://www.cnblogs.com/soundcode/p/1911901.html