如何让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
相关产品推荐
相关产品推荐

