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

如何让for循环仅在while循环满足DONE条件后才递增计数器?

问题:控制for循环计数器仅在特定条件下递增

我尝试在for循环中编写条件控制逻辑,代码如下:

for (int i = 0; i < programs.size(); i++) {
    String status = "";
    ...
    String jobId = invokeAPI(userId, data); // RPC call
    while (!status.equals("DONE")) {
        if (status.equals("EXIT")) {
            break;
        }
        status = invokeAPI(jobId); // RPC Call
        Thread.sleep(60000);
    }
}

我希望仅当status为DONE时,才递增for-loop的计数器。但当前实现中,Thread.sleep后会从0索引的代码行重新执行,请问该如何修改这段代码?


解决方法

普通for循环的计数器是自动递增的,无法直接根据内部条件控制是否推进循环。可以通过以下两种方式实现需求:

方案1:改用while循环手动控制计数器

这种方式逻辑直观,完全掌控计数器的变化:

int i = 0;
while (i < programs.size()) {
    String status = "";
    // ... 原有业务逻辑
    String jobId = invokeAPI(userId, data); // RPC call
    while (!status.equals("DONE")) {
        if (status.equals("EXIT")) {
            break;
        }
        status = invokeAPI(jobId); // RPC Call
        Thread.sleep(60000);
    }
    // 仅当状态为DONE时,才递增计数器处理下一个program
    if ("DONE".equals(status)) {
        i++;
    }
    // 若状态为EXIT,计数器保持不变,下次循环继续处理当前program
}

方案2:修改原有for循环,移除自动递增

保留for循环结构,但去掉计数器的自动递增,改为手动控制:

for (int i = 0; i < programs.size(); ) { // 移除末尾的i++
    String status = "";
    // ... 原有业务逻辑
    String jobId = invokeAPI(userId, data); // RPC call
    while (!status.equals("DONE")) {
        if (status.equals("EXIT")) {
            break;
        }
        status = invokeAPI(jobId); // RPC Call
        Thread.sleep(60000);
    }
    // 仅当状态为DONE时,才推进计数器
    if ("DONE".equals(status)) {
        i++;
    }
}

额外注意事项

  • 字符串比较建议使用"DONE".equals(status)的形式,避免status为null时抛出空指针异常
  • 建议给内部的while循环添加超时机制,防止因RPC调用异常导致无限阻塞
  • 确保invokeAPI(jobId)返回的状态值符合预期,避免逻辑判断出错

内容的提问来源于stack exchange,提问作者puneet Shah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:22:58