BigDecimal空安全Comparator实现问题:代码抛NPE求助
问题分析与解决方案
问题根源
第一段代码报错原因
当ProductBenefitResponse的getDescription或getBenefitLimit返回null时,Comparator.comparing会直接调用对应类型的compareTo方法,null调用实例方法必然触发NullPointerException。
第二段代码报错原因
Comparator.nullsFirst()的作用是处理列表中的ProductBenefitResponse对象本身为null的场景,而非处理对象的属性(比如benefitLimit、description)为null的情况。你的代码中是benefitLimit这个BigDecimal属性为null,调用它的compareTo方法自然会抛出NPE。
解决方案
需要为每个属性的比较逻辑单独设置空值处理,在Comparator.comparing中传入第二个参数——处理该属性null情况的比较器:
List<ProductBenefitResponse> list = new ArrayList<>(benefitMap.values()); list.sort( // 先按description排序,null值排在前面 Comparator.comparing(ProductBenefitResponse::getDescription, Comparator.nullsFirst(String::compareTo)) // 再按benefitLimit排序,null值排在前面 .thenComparing(ProductBenefitResponse::getBenefitLimit, Comparator.nullsFirst(BigDecimal::compareTo)) );
如果希望null值排在末尾,把Comparator.nullsFirst替换为Comparator.nullsLast即可。
如果列表中可能存在ProductBenefitResponse对象本身为null的情况,在外层再包裹一层空值处理:
list.sort( Comparator.nullsFirst( Comparator.comparing(ProductBenefitResponse::getDescription, Comparator.nullsFirst(String::compareTo)) .thenComparing(ProductBenefitResponse::getBenefitLimit, Comparator.nullsFirst(BigDecimal::compareTo)) ) );
这样不管是元素本身为null,还是元素的属性为null,都能安全完成排序,不会触发空指针异常。
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

