Проверка типа данных BigDecimal для нулей в Java

Я пытаюсь проверить значения NULL для типа данных BigDecimal в java. Я могу проверить значение 0, однако NULL приводит к исключению точки NULL. Должен ли я обрабатывать проверку этого типа данных в исключении или есть какой-то расчет, который я могу выполнить для данных, чтобы проверить его. Ниже приведен пример того, что я сделал до сих пор:

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

     logger.info('Valid Data');
    }

person devdar    schedule 10.04.2013    source источник
comment
У вас есть два & - если они будут && - логическая логика должна работать лучше с этим изменением. Кроме того, логическая логика, вероятно, будет более понятной и, возможно, будет работать лучше, если вы разделите сравнения широты и долготы. Также вместо использования compareTo() != 0 вы, вероятно, захотите использовать equals(BigDecimal.ZERO).   -  person Rob I    schedule 11.04.2013
comment
@RobI вам не следует использовать .equals с BigDecimal, так как при этом учитывается точность, поэтому 0.00 не equals 0. compareTo правильный подход.   -  person Boris the Spider    schedule 11.04.2013
comment
Спасибо, @bmorris591 - я этого не знал!   -  person Rob I    schedule 11.04.2013


Ответы (3)


Ваш || должен быть && - происходит то, что когда вы передаете нулевое значение, оно оценивается как false в первых двух условиях, но затем переходит к третьему и четвертому условиям и приводит к исключению. Если вы измените || на &&, то оценка короткого замыкания предотвратит оценку третьего и четвертого условий.

Убедитесь, что вы используете &&, а не & - первый использует оценку короткого замыкания, но последний заставит оценить третье и четвертое условия, и вы снова получите исключение нулевого указателя. condition1 && condition2 говорит: «вернуть false, если условие1 ложно, иначе оценить условие2» - если условие1 ложно, то условие2 никогда не оценивается. Напротив, condition1 & condition2 всегда будет оценивать оба условия. Единственная причина использовать & — если условия имеют побочные эффекты. Аналогично, condition1 || condition2 не будет оценивать условие2, если условие1 истинно, но | всегда будет оценивать оба условия.

person Zim-Zam O'Pootertoot    schedule 10.04.2013

Ваш тест здесь

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 и не нулем, либо crimeLongLocation не является null и не zero.

Когда вы используете &, оцениваются обе стороны выражения, когда вы используете &&, тогда тест замыкается, если первая часть выражения равна false.

person Boris the Spider    schedule 10.04.2013

Вам нужна проверка нулевых значений перед сравнением. Вы можете использовать эту функцию для сравнения.

/** 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;
}       
person Naeem Iqbal    schedule 21.08.2015