2016-12-05 25 views
-3
class A{ 

    private List<String> users; 

    public List<String> getusers(){ 
     users.trimToSize(); 
     return users; 
    } 


    class B{ 

     public static void main(String[] args){ 

      for(String user:getusers()){ 
       System.out.println("user is :"+user); 
      } 
     } 

以上爲循環扔ConcurrentModificationException例外。我該如何解決它?併發修改例外,帶有表

+1

你有沒有做過任何先前的研究......就像尋找異常消息一樣? – GhostCat

+4

當我運行它時,我得到一個NullPointerException。你沒有向我們展示什麼? –

+0

我沒有寫出確切的代碼(我做的示例代碼)我不能寫我的實際代碼在這裏,我的主要問題是我如何避免在這裏的併發修改異常, –

回答

0

如果兩個線程同時調用,則此代碼只會觸發CME

爲了避免異常時,您可以返回用戶列表的副本:

return new ArrayList<>(users); 

或始終保持trimed列表或保證列表訪問是​​。

+0

我沒有看到拋出類ArrayList中'trimToSize'方法的源代碼的異常。所以同時運行getusers()方法不會拋出CME。除此之外,我認爲OP不使用線程。 CME更常見的原因是在迭代時更改集合。 – Seelenvirtuose

+0

這真的是不對的。如果您修改集合_inside_循環遍歷它,您可以只用一個線程獲得'ConcurrentModificationException'。這裏最可能的情況是OP在她的for循環中有一些代碼以某種方式更改她的List。但是由於她拒絕透露,我們永遠不會知道。 –

+0

恕我直言如上所述,OP的代碼只能在拋出'trimToSize'時另一個線程試圖在列表上工作的情況下拋出CME。 – OldCurmudgeon