Java中处理函数返回值,实现非法参数场景返回指定错误码的解决方案
问题根因
你当前的判断逻辑存在两个核心缺陷:
- 合法调用场景下也可能返回0.0:当入参
price为0时,即便transmission取值合法('A'/'M'),计算结果price * 0.05也等于0.0,会和错误场景的返回值冲突,导致逻辑误判。 - 直接用
==判断浮点数相等存在精度隐患,哪怕当前场景下这个问题不突出,也属于不规范的写法。
你现在能看到错误提示却没有返回-1,大概率是入参price刚好为0,错误场景的返回值和合法计算的返回值完全一致,原判断逻辑本身存在规则漏洞。
最优解决方案
最优的方式是修改被调用函数calculateValuationByTransmission的错误标识逻辑,用业务中不可能出现的返回值代表错误,避免和合法返回值冲突:
步骤1:修改calculateValuationByTransmission的错误返回
把非法入参分支的返回值从0改为Double.NaN(非数字,合法计算场景永远不会返回该值):
public static double calculateValuationByTransmission(double price, char transmission) { if (transmission == 'A') { return price * 0.05; } else if (transmission == 'M') { return price * -0.05; } else { System.out.println("Transmission must be: 'A' or 'M'"); return Double.NaN; // 替换原来的return 0; } }
步骤2:修改调用处的判断逻辑
用Double.isNaN()方法判断返回值是否为错误标识:
// HERE 处的逻辑修改为 double valueTransmission = PAC1Ex2.calculateValuationByTransmission(price, transmission); if (Double.isNaN(valueTransmission)){ return -1; }
备选方案(无法修改被调用函数时使用)
如果你没有权限修改calculateValuationByTransmission的代码,可以在调用该方法前先校验transmission的取值,从源头避免非法入参:
// 在调用calculateValuationByTransmission之前加校验 if (transmission != 'A' && transmission != 'M') { System.out.println("Transmission must be: 'A' or 'M'"); return -1; } double valueTransmission = PAC1Ex2.calculateValuationByTransmission(price, transmission); // 后续不需要再判断valueTransmission是否为0
这个方案不需要调整原有方法逻辑,也能完全避免你的问题。
内容的提问来源于stack exchange,提问作者Panri93
相关产品推荐
相关产品推荐

