2015-06-09 151 views
1

我正在Java上執行一個庫系統。我有一個課叫做東西有兩個孩子:打印數字打印然後分爲期刊即使使用ListIterator,ConcurrentModificationException仍然存在

以下是我寫給打印項目的代碼片段。完整的代碼有導入。

public class Collection 
{ 
    private ArrayList <Things> theCollection; 
    private ListIterator <Things> listItr; 

    public Collection() 
    { 
     theCollection = new ArrayList <>(); 
     listItr = theCollection.listIterator(); 
    } 

    public void get() 
    { 
     Things sThing; 
     Book sBook; 
     Periodical sPeriodical; 
     Digital sDigital; 

     sThing = listItr.next(); 
     if (sThing instanceof Book) 
     { 
      sBook = (Book) sThing; 
      sBook.bookInfo(); 
     } 
     else if (sThing instanceof Periodical) 
     { 
      sPeriodical = (Periodical) sThing; 
      sPeriodical.periodicalInfo(); 
     } 
     else if (sThing instanceof Digital) 
     { 
      sDigital = (Digital) sThing; 
      sDigital.digitalInfo(); 
     } 
    } 

    public void printAll() 
    { 
     while (listItr.hasNext()) 
      get(); 
    } 
} 

我對下面的語句有問題的get()方法:

sThing = listItr.next(); 

當我運行的代碼,它給了我一個ConcurrentModificationException的。我試圖在網上搜索答案,但他們都建議使用迭代器,我也有。我在哪裏做錯了?

感謝您的幫助。

+1

如何(以及何時)將項目添加到列表中? – Mureinik

+0

你能分享bookInfo()方法嗎? – dogankadriye

回答

4

問題

創建/在構造你的類,創建列表後直接要求的迭代器。此時該列表將爲空。

我假設你之後向/從該列表添加/移除元素。這是一個併發修改,因爲迭代器限制迭代發生在創建後的未修改列表中。下一次對迭代器的調用將拋出這個異常。

解決方案

不要建立在類的構造函數的迭代器。在所需的時間來創建它:

public class Collection { 
    private ArrayList <Things> theCollection; 

    public Collection() { 
     theCollection = new ArrayList <>(); 
    } 

    public void get() { 
     ... 
     ListIterator <Things> listItr = theCollection.listIterator(); 
     sThing = listItr.next(); 
     ... 
    } 
} 
3

問題出在構造函數中:

public Collection() 
{ 
    theCollection = new ArrayList <>(); 
    listItr = theCollection.listIterator(); 
} 

要創建將元素添加到列表之前的ListIterator;爲了避免錯誤,您必須在迭代元素之前創建迭代器;所以刪除在構造器中的迭代器創建,並在需要之前放置;對於類似的問題見herehere

相關問題