Java:由于方法调用,for循环在所有迭代之前都会中断

时间:2017-02-22 12:27:41

标签: java for-loop method-call

我面临着一个奇怪的问题。在下面的代码片段中,当我调用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;
        }

3 个答案:

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