2017-02-22 11 views
0

Я столкнулся с причудливой проблемой. В приведенном ниже фрагменте кода 2-й цикл цикла прерывается после одной итерации, когда я вызываю userRoles.removeRole (strRole). В списке есть 2 элемента. Первый цикл цикла выполняется дважды. Но второй выполняется только один раз. Указанный вызов метода возвращает логическое значение. Может кто-нибудь, пожалуйста, помогите мне, что случилось в моем коде?Java: для цикла прерывается перед всеми итерациями из-за вызова метода

 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

Вы правы, ive исправил ответ. Спасибо @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; 
     }