Java出现Cannot read field "scale" because "multiplicand" is null报错如何避免
错误原因
该java.lang.NullPointerException: Cannot read field "scale" because "multiplicand" is null报错触发于BigDecimal执行乘法运算时,传入的乘数参数为null,结合给出的代码,共有两处可能的触发场景:
- 场景1:调用
price.multiply(q)时,传入的参数q为null - 场景2:
tariffs列表中存在元素的getPrice()返回null,流处理map阶段得到null值,后续reduce执行BigDecimal::add时传入null,最终得到的price为null触发报错
修复方案
步骤1:处理流计算阶段的空值
在map操作后增加空值过滤,避免tariff.getPrice()返回null导致后续运算异常:
import java.util.Objects; BigDecimal price = tariffs.stream() .map(tariff -> tariff.getPrice()) // 过滤空的price值 .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add);
由于reduce设置了初始值BigDecimal.ZERO,经过上述处理后price一定不会为null。
步骤2:处理乘法参数q的空值
可根据业务需求选择校验抛出异常或者兜底默认值两种处理方式:
方式1:提前校验空值
// 业务不允许q为空时抛出明确异常,方便排查上游问题 if (q == null) { throw new IllegalArgumentException("计算参数q不能为空"); // 若允许为空兜底默认值可替换为 q = BigDecimal.ZERO; } BigDecimal productPrice = price.multiply(q).setScale(2, RoundingMode.HALF_UP);
方式2:Optional优雅处理空值
import java.util.Optional; BigDecimal productPrice = Optional.ofNullable(q) .map(price::multiply) // q为空时兜底返回0 .orElse(BigDecimal.ZERO) .setScale(2, RoundingMode.HALF_UP);
提示:如果业务逻辑不允许价格参数为空,优先选择抛出明确异常的处理方式,不要盲目兜底默认值掩盖上游数据错误。
内容的提问来源于stack exchange,提问作者TtT
相关产品推荐
相关产品推荐

