posts - 110, comments - 101, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
          /**
           * 
           
          */

          package com.test;

          import java.util.ArrayList;
          import java.util.Iterator;
          import java.util.List;
          import java.util.concurrent.CopyOnWriteArrayList;

          /**
           * 
          @author hello_yun
           *
           
          */

          public class ListOperation
          {

              
          /**
               * 
          @param args
               
          */

              
          public static void main(String[] args)
              
          {
                  List
          <Integer> list1 = new ArrayList<Integer>();
                  List
          <Integer> list2 = new CopyOnWriteArrayList<Integer>();
                  list1.add(
          1);
                  list1.add(
          2);
                  list1.add(
          3);
                  
                  list2.add(
          3);
                  list2.add(
          4);
                  
          //        try
          //        {
          //            for(Integer in : list1){
          //                list1.remove(in);//直接循環 刪除對象會拋異常
          //            }
          //        } catch (Exception e)
          //        {
          //            System.out.println("list1 size : "+list1.size());
          //            System.out.println("循環list1 異常 : "+e);
          //        }
                  
                  
                  
          for(Integer in : list2){
                      list2.remove(in);
                      System.out.println(
          "list2 : "+list2.size());
                  }

                  
                   
                  
                  list1.add(
          1);
                  list1.add(
          2);
                  
                  list2.add(
          3);
                  list2.add(
          4);
                  
                  
          for (Iterator iterator = list1.iterator(); iterator.hasNext();)
                  
          {
                      iterator.next();
                      iterator.remove();
                  }

                  
                  
                  
          try
                  
          {
                      
          for (Iterator iterator = list2.iterator(); iterator.hasNext();)
                      
          {
                          iterator.next();
                          iterator.remove();
                      }


                  }
           catch (Exception e)
                  
          {
                      System.out.println(
          "copyOnWriteArrayList remove : "+ e);
                  }

                  
                  
          //-------------這種方式 不會拋異常 -------------------------
                  try
                  
          {
                      
          for(int i=0;i<list1.size();i++){
                          list1.remove(i);
                      }


                  }
           catch (Exception e)
                  
          {
                      System.out.println(
          "list1 size : "+list1.size());
                      System.out.println(
          "循環list1 異常 : "+e);
                  }


              }


          }


          使用 copyOnWriteArrayList時 ,通過 list.remove()方法是安全的 但是使用iterator.remove是會拋異常的
          查看copyOnWriteArrayList源碼 會發現 iterator.remove方法的實現是直接拋異常的
                  /**
                   * Not supported. Always throws UnsupportedOperationException.
                   * @throws UnsupportedOperationException always; <tt>remove</tt>
                   *         is not supported by this iterator.
                   */
                  public void remove() {
                      throw new UnsupportedOperationException();
                  }

          但是通過ArrayList實現時, list.remove會拋異常 java.util.ConcurrentModificationException,
          但是 ArrayList的 iterator.remove不會拋異常




          評論

          # re: list 循環時 remove方法 異常 與 處理 方式 [未登錄]  回復  更多評論   

          2015-12-09 11:05 by Young
          使用for(int i=0;i<list1.size();i++)這種形式去remove元素,雖然不會拋異常,但是未能正確的remove元素,最后的list1的size不等于0

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 昌图县| 获嘉县| 阿克陶县| 广昌县| 比如县| 浦北县| 日土县| 通许县| 西吉县| 安义县| 正蓝旗| 托里县| 长宁区| 五指山市| 洮南市| 新丰县| 玛曲县| 营口市| 株洲县| 金堂县| 苍南县| 庆安县| 沛县| 饶河县| 滦平县| 迁西县| 广河县| 准格尔旗| 晋州市| 云林县| 南江县| 金门县| 顺义区| 长武县| 南安市| 改则县| 蒙城县| 尉犁县| 富锦市| 商南县| 长治市|