2017-02-22 60 views
0

我正面臨着一個奇怪的問題。在下面的代碼片段中,當我調用userRoles.removeRole(strRole)時,第二個for循環在一次迭代後破壞。列表中有2個元素。第一個for循環執行兩次。但是第二個只執行一次。該方法調用返回布爾值。任何人都可以請幫我在我的代碼中有什麼問題?Java:由於方法調用,for循環在所有迭代之前打破了

 if(userRoles != null) 
     { 
      List<String> roles = userRoles.getRoles(); 
      String strUserName = userRoles.getUserName(); 

      for(String strRole: roles) 
      { 
       System.out.println("role : " + strRole); 
      } 
      //for(String strRole: roles) 
      for(int count = 0; count < roles.size() ; count++) 
      { 
       String strRole = roles.get(count); 
       System.out.println("role before check: " + strRole); 
       if(ur.hasRoleForUser(strRole, strUserName)) 
       { 
        System.out.println("role after check: " + strRole); 
        userRoles.removeRole(strRole); 
       } 
      } 

      System.out.println("role length: " + userRoles.getRoles().size()); 
      if(userRoles.getRoles().size() > 0) 
      { 
       ur.addUserRoles(userRoles); 
      } 
      blnSuccess = true; 
     } 
+1

請顯示removeRole(str)方法在做什麼。 – Abdulgood89

+0

爲什麼它會很奇怪?您正在從您列舉的列表中刪除一個項目。 2 - 1 = 1。'getRoles'顯然返回對同一個列表'removeRole'的引用縮短。 –

+0

@MargaretBloom是的,你是對的...我沒有注意到它...我認爲它作爲新的對象,這並沒有指對象的列表,從中刪除項目。謝謝您的回覆。 – NPException

回答

2

,因爲你刪除你遍歷列表的元素的循環中斷(刪除後,您的列表的大小爲1,這樣算< roles.size()變爲假)

在循環中,您應該首先收集循環後要刪除的元素。

+0

使用迭代器會拋出'ConcurrentModificationException',因爲'removeRole'不能調用所述迭代器的'remove'方法。 –

+0

你說得對,我更正了答案。謝謝@Margaret Bloom – kamehl23

1

您的for循環在每次迭代之前評估count < roles.size()

由於在你的第一次迭代,調用userRoles.removeRole(strRole),在接下來的時間循環將評估roles.size()返回的值是1。由於1是事實不大於1(共count在該點的值)循環將停止進一步的迭代。

由於@ kamehl23提供,你應該使用列表迭代器。 另一個建議將是而不是修改您當前遍歷的元素。將爲您節省大量的錯誤時間。

祝你好運。

+1

只要不是結構修改,您可以修改迭代器的項目,否則'ConcurrentModificationException'。 –

1

謝謝大家的回答。我沒有正確地注意到它......我認爲角色列表是新對象,並不是指對象的列表,每個對象都從中刪除。這是我更新的代碼。

 if(userRoles != null) 
     { 
      List<String> roles = userRoles.getRoles(); 
      String strUserName = userRoles.getUserName(); 

      for(int count = roles.size()-1; count >= 0 ; count--) 
      { 
       String strRole = roles.get(count); 
       if(ur.hasRoleForUser(strRole, strUserName)) 
       { 
        userRoles.removeRole(strRole); 
       } 
      } 

      if(userRoles.getRoles().size() > 0) 
      { 
       ur.addUserRoles(userRoles); 
      } 
      blnSuccess = true; 
     }