我正在尝试验证java中数据类型BigDecimal的NULL。我能够验证0值,但是NULL会导致 NULL Point Exception 。我是否应该在异常中处理此数据类型的验证,或者是否有一些计算我可以对数据进行预处理以验证它。 Under是我到目前为止所做的一个例子:
if(crime.getCrimeLatLocation() != null & crime.getCrimeLongLocation() != null || crime.getCrimeLatLocation().compareTo(BigDecimal.ZERO) != 0 & crime.getCrimeLongLocation().compareTo(BigDecimal.ZERO) != 0){
logger.info('Valid Data');
}
答案 0 :(得分:3)
你的||
应该是&&
- 正在发生的事情是当你传入一个空值时,它在前两个条件中评估为假,但随后它继续进行第三和第四个条件并导致例外。如果您将||
更改为&&
,那么短路评估将阻止评估第三和第四个条件。
一定要使用&&
而不是&
- 前者使用短路评估,但后者会强制评估第三和第四个条件,你会得到一个空指针例外。 condition1 && condition2
表示“如果condition1为false则返回false,否则评估condition2” - 如果condition1为false,则从不评估condition2。相反,condition1 & condition2
将始终评估这两个条件。使用&
的唯一原因是条件有副作用。同样,如果condition1为true,condition1 || condition2
将不会评估condition2,但|
将始终评估这两个条件。
答案 1 :(得分:1)
你的考试
if(crime.getCrimeLatLocation() != null & crime.getCrimeLongLocation() != null
|| crime.getCrimeLatLocation().compareTo(BigDecimal.ZERO) != 0 & crime.getCrimeLongLocation().compareTo(BigDecimal.ZERO) != 0)
使用二进制非布尔运算符,将其更改为
if((crime.getCrimeLatLocation() != null && crime.getCrimeLatLocation().compareTo(BigDecimal.ZERO) != 0)
|| (crime.getCrimeLongLocation() != null && crime.getCrimeLongLocation().compareTo(BigDecimal.ZERO) != 0))
这表示crimeLatLocation
不是null
而不是0或crimeLongLocation
不是null
而不是zero
。
当您使用&
时,表达式的两边都会被评估,当您使用&&
时,如果表达式的第一部分是false
,则测试会被短路。
答案 2 :(得分:1)
在比较之前,您需要检查空值。您可以使用此功能进行比较。
PUT