如果不是BigDecimal
,我有一个Long
金额要转换为null
,但是我却有一个java.lang.NullPointerException
例外:
BigDecimal bgAmount = getAmount();
long totalSupplyFilterMin =
Optional.ofNullable(bgAmount.longValue()).orElse(Long.MIN_VALUE);
答案 0 :(得分:7)
请勿使用Optional
进行空检查。只需明确检查null
,然后然后取消引用该对象(如果它不为null)。
BigDecimal bgAmount = getAmount();
long totalSupplyFilterMin = Long.MIN_VALUE;
if(bgAmount != null) {
totalSupplyFilterMin = bgAmount.longValue();
}
You use Optional
as a return value to indicate the absence of a value.它不是代替空检查。
答案 1 :(得分:5)
首先,您错误地使用了Optional
。当bgAmount == null
时,Optional.ofNullable(bgAmount.longValue())
抛出NPE
。正确的用法是:
Optional.ofNullable(bgAmount)
.orElse(BigDecimal.valueOf(Long.MIN_VALUE))
.longValue();
或
Optional.ofNullable(bgAmount)
.map(BigDecimal::longValue)
.orElse(Long.MIN_VALUE);
答案 2 :(得分:1)
似乎bgAmount
为空,因此在调用bgAmount.longValue()
时会出现异常。
long totalSupplyFilterMin = Optional.ofNullable(bgAmount.longValue())
.orElse(Long.MIN_VALUE);
请不要在此处使用ofNullable
,因为bgAmount.longValue()
永远不会为null。
您可能想做:
Optional.ofNullable(bgAmount).map(s -> s.longValue()).orElse(Long.MIN_VALUE);
答案 3 :(得分:1)
通常,我们的代码库中有一个模式,类似于下面的代码,但在这种情况下,与Makoto's answer并没有太大区别:
long totalSupplyFilterMin = Long.MIN_VALUE;
BigDecimal bgAmount;
if ((bgAmount = getAmount()) != null) {
totalSupplyFilterMin = bgAmount.longValue();
}
您读取 变量bgAmount
的唯一次数不同,此代码读取一次,而不是上面的答案两次(这非常罕见,即使有-但我已经养成了编写此类代码的习惯)。
答案 4 :(得分:0)
如果bgAmount
是null
,则在其上调用longValue
将得到NullPointerException
。请注意,这与可选项无关,因为在您应用可选项之前就已经调用了它。
相反,您可以致电map
来安全地应用此转换:
long totalSupplyFilterMin =
Optional.ofNullable(bgAmount).map(BigDecimal::longValue).orElse(Long.MIN_VALUE);