標籤:
package com.test.io;import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.util.LinkedList;import com.mysql.jdbc.Buffer;public class ReadKeyFile { public static void main(String[] args) throws IOException { BufferedReader bufferedReader=null; try { bufferedReader = new BufferedReader(new FileReader("C:/Users/Administrator/Desktop/test.txt")); LinkedList<String> list = new LinkedList<String>(); String str=bufferedReader.readLine(); while((str=bufferedReader.readLine())!=null) { System.out.println(str); list.add(str); } System.out.println("------------"); for (String string : list) { System.out.println(list.removeLast()); } } catch (Exception e) { e.printStackTrace(); } finally { if(bufferedReader != null) bufferedReader.close(); } }}
結果及報錯:
222222222222222222223333333333333333333344444444444444444444555555555555555555556666666666666666666677777777777777777777------------77777777777777777777java.util.ConcurrentModificationException at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:966) at java.util.LinkedList$ListItr.next(LinkedList.java:888) at com.test.io.ReadKeyFile.main(ReadKeyFile.java:24)
test.txt:
11111111111111111111222222222222222222223333333333333333333344444444444444444444555555555555555555556666666666666666666677777777777777777777
如果將原始碼紅色部分替換為以下,則可以正常輸出,可見問題並不在remveLast()方法,而在迭代。
System.out.println(list.removeLast());System.out.println(list.removeLast());
在網上查到一段文字:
1.在使用增強for迴圈進行集合的迭代的時候其實預設使用的是迭代器;
2.因此在迴圈中不能使用集合的引用變數直接操作集合,避免導致多線程並發訪問的安全性異常。
1的意思即增強for迴圈的遍曆方式類似與:
Iterator<String> iterator = list.iterator(); while(iterator.hasNext()) System.out.println(iterator.next());
鑒於此,有必要看一下LinkedList的代碼。在LinkedList中,這個iterator就是ListItr ,它是繼承自Itr類,next()方法正是出自Itr類,在裡面找到next()的源碼如下:
public E next() { checkForComodification(); try { int i = cursor; E next = get(i); lastRet = i; cursor = i + 1; return next; } catch (IndexOutOfBoundsException e) { checkForComodification(); throw new NoSuchElementException(); }}
注意checkForComodification(),這就是報錯的地方啦,具體是在下面這個地方報的錯:
final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException();}
根據我們的測試:LinkedList列印出第一排7就報錯了。
modCount 這個在打應出第一排7之後的值應該為8,因為add了7次,又removeLast了一次嘛
那expect為多少呢?
看看Itr原始碼吧,真亂,又實在是不想去讀注釋,我還是去翻翻JAVA編程思想先
LinkedList - java.util.ConcurrentModificationException