我面临着一个奇怪的问题。在下面的代码片段中,当我调用userRoles.removeRole(strRole)时,第二个for循环在一次迭代后中断。列表中有2个元素。第一个for循环正在执行两次。但第二个只执行一次。所述方法调用返回boolean。有人可以帮我解释一下代码中的错误吗?
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;
}
答案 0 :(得分:2)
循环中断是因为您删除了正在遍历的列表元素(删除后,列表的大小为1,因此count&lt; roles.size()变为false)
在循环中,首先应该收集循环后要删除的元素
答案 1 :(得分:1)
您的for
循环在每次迭代之前评估count < roles.size()
。
由于您在第一次迭代中调用userRoles.removeRole(strRole)
,因此在下次循环将评估roles.size()
时,返回值将为1.因为1不大于1(此时count
的值)循环将停止进一步的迭代。
正如@ kamehl23所提供的,你应该使用list迭代器。 另一个建议是不来修改您当前正在遍历的元素。将为您节省大量的错误时间。
祝你好运。答案 2 :(得分: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;
}