You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 07:39:05