为何满足条件时getBestFare()仍返回null?求技术排查
问题修复:getBestFare() 始终返回null的解决办法
核心问题分析
- getBestFare() 逻辑完全错误
原方法的循环逻辑既没正确找到最低价格选项,也没在遍历结束后返回结果:
- 初始
num=0,循环从i=0开始,第一次比较无意义; - 就算找到更低价格的选项,直接返回的仍是初始
num=0对应的选项,而非当前低价选项; - 若循环中未触发任何
return,就会走到最后返回null。
- getRidePrices() 计算逻辑错误
原price2的计算属于冗余化简,且未正确计算7天票的单次乘车成本:
double price2 = ((cost[1]*unlimited7Price()) / (unlimited7Price() * 7));
化简后等价于cost[1]/7,这不是基于总乘车次数的单次成本,完全不符合需求。
- 构造函数参数校验缺陷
当参数无效时,仅打印提示但未终止对象初始化,会导致numberOfDays和transCount保持默认值0,后续计算出现异常。
修复后的完整代码
public class TransitCalculator { public int numberOfDays; public int transCount; public TransitCalculator(int numberOfDays, int transCount) { if (numberOfDays <= 30 && numberOfDays > 0 && transCount > 0) { this.numberOfDays = numberOfDays; this.transCount = transCount; } else { throw new IllegalArgumentException("Invalid data: numberOfDays must be 1-30, transCount must be positive"); } } String[] fareOptions = {"Pay-per-ride", "7-day Unlimited", "30-day Unlimited"}; double[] baseCosts = {2.75, 33.00, 127.00}; public double calculateUnlimited7TotalCost() { int weekCount = numberOfDays / 7; if (numberOfDays % 7 > 0) { weekCount += 1; } return weekCount * baseCosts[1]; } public double[] getPerRideCosts() { // 单次票成本 double payPerRide = baseCosts[0]; // 7天票总花费 / 总乘车次数 = 单次成本 double unlimited7PerRide = calculateUnlimited7TotalCost() / transCount; // 30天票总花费 / 总乘车次数 = 单次成本 double unlimited30PerRide = baseCosts[2] / transCount; return new double[]{payPerRide, unlimited7PerRide, unlimited30PerRide}; } public String getBestFare() { double[] perRideCosts = getPerRideCosts(); int bestIndex = 0; // 遍历找到最低单次成本的选项索引 for (int i = 1; i < perRideCosts.length; i++) { if (perRideCosts[i] < perRideCosts[bestIndex]) { bestIndex = i; } } // 返回格式化结果 return String.format("You should get the %s option at $%.2f per ride.", fareOptions[bestIndex], perRideCosts[bestIndex]); } public static void main(String[] args) { TransitCalculator calculator = new TransitCalculator(30, 30); System.out.println("7-day unlimited total cost: " + calculator.calculateUnlimited7TotalCost()); System.out.println("30-day unlimited per ride cost: " + calculator.getPerRideCosts()[2]); System.out.println(calculator.getBestFare()); } }
修复要点说明
- getBestFare() 逻辑修正:先遍历所有选项找到最低成本的索引,再统一返回结果,避免中途错误返回;同时缓存
getPerRideCosts()的结果,避免重复计算。 - getPerRideCosts() 计算修正:正确计算每种票的单次乘车成本(总花费除以总乘车次数)。
- 构造函数优化:参数无效时抛出异常,避免后续计算使用无效的默认值。
- 命名优化:修改变量名使其更具可读性(如
length改为fareOptions,cost改为baseCosts)。
内容的提问来源于stack exchange,提问作者arturu007
相关产品推荐
相关产品推荐

