You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

控制变量“i”被修改:tubes.remove(i--)触发Checkstyle错误

解决Checkstyle“控制变量‘i’被修改”的问题

我来帮你搞定这个Checkstyle报错的问题!你遇到的错误是因为在for循环里,循环控制变量i已经由循环条件的i++来管理了,但你又在循环体里用i--修改了它——Checkstyle会认为这种操作很容易引发逻辑混乱(比如索引越界、漏遍历元素),所以触发了这个错误。

下面给你几种既符合代码规范又能实现需求的解决方案:

方案1:倒序遍历集合

倒序遍历的时候,删除当前元素不会影响前面未遍历元素的索引,所以完全不需要修改循环变量i,完美避开Checkstyle的限制:

for (int i = tubes.size() - 1; i >= 0; i--) {
    Rectangle rect = tubes.get(i);
    rect.x -= spd;
    if (rect.x + 40 <= 0) {
        tubes.remove(i);
        Hra.getHrac1().setSkore(0.5);
        // 这里不需要continue或调整i,倒序遍历不受删除操作影响
    }
}

方案2:使用Iterator迭代器(推荐)

这是集合遍历删除的标准做法,Iterator专门提供了安全的删除方法,不会出现索引混乱的问题,也完全符合Checkstyle的规范:

Iterator<Rectangle> iterator = tubes.iterator();
while (iterator.hasNext()) {
    Rectangle rect = iterator.next();
    rect.x -= spd;
    if (rect.x + 40 <= 0) {
        iterator.remove(); // 用迭代器的remove方法安全删除元素
        Hra.getHrac1().setSkore(0.5);
    }
}

方案3:改用while循环手动控制索引

如果坚持要用正序遍历的逻辑,可以把for循环改成while循环,手动控制i的递增时机,避免在循环条件和循环体中同时修改i:

int i = 0;
while (i < tubes.size()) {
    Rectangle rect = tubes.get(i);
    rect.x -= spd;
    if (rect.x + 40 <= 0) {
        tubes.remove(i);
        Hra.getHrac1().setSkore(0.5);
        // 删除元素后,下一个元素会移到当前i的位置,所以不递增i
    } else {
        i++; // 只有没删除元素时才递增索引
    }
}

这三种方法都能解决你遇到的Checkstyle错误,其中迭代器和倒序遍历的写法更简洁、更安全,也更符合Java集合操作的最佳实践。

内容的提问来源于stack exchange,提问作者Adam Šovčík

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:13:53