4

我正在尝试验证 java 中数据类型 BigDecimal 的 NULL。我能够验证 0 值,但是 NULL 会导致NULL Point Exception。我是否应该在异常中处理此数据类型的验证,或者是否可以对数据进行一些计算以对其进行验证。下面是我到目前为止所做的一个例子:

 if(crime.getCrimeLatLocation() != null  & crime.getCrimeLongLocation() != null || crime.getCrimeLatLocation().compareTo(BigDecimal.ZERO) != 0 & crime.getCrimeLongLocation().compareTo(BigDecimal.ZERO) != 0){

     logger.info('Valid Data');
    }
4

4 回答 4

3

||应该是&&- 发生的事情是,当你传入一个空值时,它在前两个条件下评估为 false,但随后它会继续处理第三个和第四个条件并导致异常。如果将 更改||&&then 短路评估将阻止评估第三和第四个条件。

一定要使用 a&&而不是 a &- 前者使用短路评估,但后者会强制评估第三和第四个条件,您将再次获得空指针异常。 condition1 && condition2说“如果条件 1 为假,则返回假,否则评估条件 2” - 如果条件 1 为假,则永远不会评估条件 2。相反,condition1 & condition2将始终评估这两个条件。使用的唯一原因&是条件是否有副作用。同样,condition1 || condition2如果 condition1 为真,则不会评估 condition2,但|将始终评估这两个条件。

于 2013-04-10T21:03:28.817 回答
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))

这表示要么crimeLatLocationis notnull且不为零,要么 is crimeLongLocationnotnull且 not zero

当你使用&then 表达式的两边都会被评估,当你使用&&then 时,如果表达式的第一部分是 ,则测试是短路的false

于 2013-04-10T21:06:53.783 回答
1

您需要在比较之前检查空值。您可以使用此功能进行比较。

/** This method compares 2 BigDecimal objects for equality. It takes care of null object and that was the necessity of having it.
 * To use this function most efficiently pass the possibly null object before the not null object.
 * @param pNumber1
 * @param pNumber2
 * @return boolean
 */
public static boolean isEqual(BigDecimal pNumber1, BigDecimal pNumber2)
{
    if ( pNumber1 == null )
    {
        if ( pNumber2 == null)
            return true;
        return false;
    }
    if ( pNumber2 == null)
        return false;
    return pNumber1.compareTo(pNumber2)==0;
}       
于 2015-08-21T13:58:13.587 回答
0

如果您的主要目标是验证 BigDecimal 数据类型是否为空值,那么只需进行比较;

yourBigDecimal != null.

上面的语句足以进行比较和检查。

于 2021-09-13T17:06:39.587 回答