养老金计划代码:getWorkingMonth打印正确值但断言失败求助
问题原因分析
你的问题核心在于**getWorkingMonth()方法直接修改了类的实例变量currentSaving**:
- 第一次调用方法时,循环会持续更新
currentSaving,直到它达到或超过pensionTarget(此时currentSaving的值已经≥240000)。 - 第二次调用方法时,
currentSaving < pensionTarget的条件不成立,循环直接跳过,返回初始值0,导致断言失败。
解决方案
方案1:使用局部变量计算,不修改实例变量(推荐)
修改getWorkingMonth()方法,用局部变量保存初始储蓄值,避免修改类的实例状态,这样每次调用都会基于初始条件重新计算:
public int getWorkingMonth() { double monthlyContribution = monthlySaving * (annualSalary / 12); int months = 0; // 用局部变量存储初始储蓄,不改动实例变量currentSaving double tempSaving = currentSaving; while (tempSaving < pensionTarget) { tempSaving += monthlyContribution + (tempSaving * (interestRate / 12)); months++; } return months; }
方案2:重置实例状态后再调用(适合需要保留实例状态的场景)
如果你需要保留currentSaving的修改状态(比如模拟持续储蓄的流程),可以在第二次调用前重置currentSaving到初始值:
// 第一次调用 System.out.println("Example: Test case 1 working months: " + fp.getWorkingMonth()); // 重置储蓄值到初始状态(如果currentSaving是私有变量,需要添加setter方法) fp.currentSaving = 0; // 第二次调用 assert fp.getWorkingMonth() == 368: "Failed test case 1: Expected working months to be 368, but got " + fp.getWorkingMonth();
内容的提问来源于stack exchange,提问作者Vikraman Arumugam
相关产品推荐
相关产品推荐

