【bug修復】ConcurrentModificationException

今天遍歷集合的時候,報出來了ConcurrentModificationException,以前總是疏忽了,這次做一下記錄

 if (mViewModel.getList().getValue() != null && mViewModel.getList().getValue().size() > 0) {
                        Iterator<String> iterator = mViewModel.getList().getValue().iterator();
                        while (iterator.hasNext()) {
                            String sn = iterator.next();
                            if (sn.equals(et.getText().toString())) {
                                mViewModel.delete(iterator);
                                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
                                isDeleteSuccess = true;
                            }
                        }
                        if (!isDeleteSuccess) {
                            ToastUtils.showToast(SnScanActivity.this, "當前列表中沒有此條sn,請重新輸入~");
                            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

                        }
                    }

原因解析:Iterator 是工作在一個獨立的線程中,並且擁有一個 mutex 鎖。 Iterator 被創建之後會建立一個指向原來對象的單鏈索引表,當原來的對象數量發生變化時,這個索引表的內容不會同步改變,所以當索引指針往後移動的時候就找不到要迭代的對象,所以按照 fail-fast 原則 Iterator 會馬上拋出 java.util.ConcurrentModificationException 異常。所以 Iterator 在工作的時候是不允許被迭代的對象被改變的。但你可以使用 Iterator 本身的方法 remove() 來刪除對象, Iterator.remove() 方法會在刪除當前迭代對象的同時維護索引的一致性。
這裏附上大神的博客,可以去查閱一下。
http://www.cnblogs.com/andy-zhou/p/5339683.html
http://bbs.csdn.net/topics/370149418
http://blog.csdn.net/wwbmyos/article/details/7887113

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章