2017-02-22 9 views
0

Ich stehe vor einem bizarren Problem. Im folgenden Codefragment bricht die zweite for-Schleife nach einer Iteration ab, wenn ich userRoles.removeRole (strRole) aufruft. Es gibt 2 Elemente in der Liste. Die erste for-Schleife wird zweimal ausgeführt. Aber der zweite wird nur einmal ausgeführt. Der genannte Methodenaufruf gibt Boolean zurück. Könnte mir bitte jemand helfen, was in meinem Code falsch ist?Java: for Schleife bricht vor allen Iteration wegen Methodenaufruf

 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

Bitte zeigen, was die removeRole (str) Methode tut. – Abdulgood89

+0

Warum sollte es seltsam sein? Sie entfernen ein Element aus der aufgelisteten Liste. 2 - 1 = 1. 'getRoles' gibt offensichtlich den Verweis auf dieselbe Liste zurück.' RemoveRole' verkürzt. –

+0

@MargaretBloom ja du hast Recht ... Ich habe es nicht richtig bemerkt ... Ich dachte es als neues Objekt, das nicht auf die Liste des Objekts verweist, aus dem das Objekt entfernt wird. Danke für Ihre Antwort. – NPException

Antwort

2

Die Schleife bricht, weil Sie ein Element der Liste entfernen, die Sie durchqueren (Nach dem Entfernen ist die Größe der Liste 1, zählen so < roles.size() wird false)

In der Schleife sollten Sie zuerst die Elemente erfassen, die Sie nach der Schleife entfernen möchten.

+0

Die Verwendung eines Iterators wird 'ConcurrentModificationException' auslösen, da' removeRole' die 'remove' Methode des Iterators nicht aufrufen kann. –

+0

Sie haben Recht, IVE korrigiert die Antwort. Danke @Margaret Bloom – kamehl23

1

Ihre for Schleife wertet vor jeder Iteration count < roles.size() aus.

Aufgrund der Tatsache, dass in der ersten Iteration Sie userRoles.removeRole(strRole) aufrufen, in der nächsten Zeit wird die Schleife roles.size() bewerten die zurückgegebene Wert 1 wird seit dem 1. nicht größer als 1 (der Wert von count an diesem Punkt) ist Die Schleife stoppt weitere Iterationen.

Da @kamehl23 angeboten wird, sollten Sie Listen-Iteratoren verwenden. Eine weitere Empfehlung lautet nicht, um die Elemente zu ändern, die Sie gerade durchlaufen. Wir sparen Ihnen viel Zeit.

Viel Glück.

+1

Sie können die Elemente eines Iterators ändern, solange es keine strukturelle Änderung ist, andernfalls 'ConcurrentModificationException'. –

1

Vielen Dank für Ihre Antworten. Ich habe es nicht richtig bemerkt ... Ich dachte, die Rollen listet als neues Objekt auf, das die Liste des Objekts, von dem jedes Element entfernt wird, nicht verweist. Hier ist mein aktualisierter Code.

 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; 
     }