如何实现Map键自动递增?Java代码successCount异常求助
问题根源分析
- processRequest内部的successCount是局部变量:每次调用该方法都会重新初始化
int successCount = 0,成功时执行responseMap.put(successCount++, failedIds),实际是先以0为key存入数据再自增,但方法执行完毕后变量就会销毁,下次调用又回到初始值0,导致responseMap里永远只有key为0的条目,根本无法统计总成功数。 - updateCust中的successCount未参与业务逻辑:这个变量仅定义但既没有传递给processRequest,也没有接收方法返回的成功计数,完全是无效变量。
- responseMap的key设计不合理:用successCount作为key会导致重复key覆盖数据,既无法正确记录每次请求的结果,也无法统计总成功数。
修复方案
我们需要将成功计数变量提升到updateCust方法内维护,让processRequest专注处理单条请求并返回成功状态,同时调整responseMap的存储逻辑,避免数据覆盖。
修复后的代码示例(统计总成功数+存储所有失败ID)
public void updateCust() { // 用固定key存储所有失败请求ID HashMap<String, List<String>> responseMap = new HashMap<>(); List<String> allFailedIds = new ArrayList<>(); responseMap.put("failedIds", allFailedIds); int requestCount = 0; int successCount = 0; for (Map.Entry<String, List<Tuple>> entry : custsGb.entrySet()) { // 接收本次请求是否成功的状态 boolean isSuccess = processRequest(allFailedIds); requestCount++; if (isSuccess) { successCount++; } } // 判断全部成功的条件:请求总数等于成功数 if (requestCount == successCount) { // all success - 200 } } // 修改后专注处理单条请求,返回是否成功,同时维护失败ID列表 public boolean processRequest(List<String> failedIds) { // 假设response是当前请求的响应对象 if (response.getStatusCode().is2xxSuccessful()) { return true; } else { // 假设id是当前请求的唯一标识 failedIds.add(id); return false; } }
可选方案(记录单条请求结果+统计成功数)
如果需要保留每条请求的成功/失败状态,可以用请求序号作为key:
public void updateCust() { // 用请求序号作为key,存储单条请求的成功状态 HashMap<Integer, Boolean> requestResultMap = new HashMap<>(); List<String> failedIds = new ArrayList<>(); int requestCount = 0; int successCount = 0; for (Map.Entry<String, List<Tuple>> entry : custsGb.entrySet()) { requestCount++; boolean isSuccess = processRequest(failedIds); requestResultMap.put(requestCount, isSuccess); if (isSuccess) { successCount++; } } if (requestCount == successCount) { // all success - 200 } } public boolean processRequest(List<String> failedIds) { if (response.getStatusCode().is2xxSuccessful()) { return true; } else { failedIds.add(id); return false; } }
关键修复点总结
- 将成功计数变量
successCount放在updateCust方法内维护,每次调用processRequest后根据结果累加。 - 删除
processRequest内部的局部successCount变量,改为返回请求是否成功的状态,避免重复初始化导致的计数错误。 - 调整responseMap的存储逻辑,避免用重复key覆盖数据,根据实际需求选择存储所有失败ID或单条请求结果。
内容的提问来源于stack exchange,提问作者user3919727
相关产品推荐
相关产品推荐

