2013-04-10 3 views
1

java의 데이터 유형 BigDecimal에서 NULL을 확인하려고합니다. 0 값에 대해 유효성을 검사 할 수 있지만 NULL의 결과는 NULL 포인트 예외입니다. 예외에서이 데이터 유형의 유효성 검사를 처리해야합니까, 아니면 유효성 검사를 위해 데이터를 미리 작성할 수있는 계산이 있어야합니다. 내가 지금까지 한 일의 예는 아래 :nulls에 대한 BigDecimal 데이터 유형 확인 Java에서

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

    logger.info('Valid Data'); 
    } 
+1

당신은'&'이있다. 또한 불리언 논리는 아마도 더 명확 할 것이며 아마도 위도/경도 비교를 분리하면 더 잘 작동 할 것입니다. 또한'compareTo()! = 0' 대신에'equals (BigDecimal.ZERO)'를 사용하고 싶을 것입니다. –

+2

@RobI '.equals'는'BigDecimal'과 함께 사용하면 안됩니다. 왜냐하면'0.00'은 '0'과'같지 않습니다. ' compareTo는 올바른 접근법이다. –

+0

고마워요, @ bmorris591 - 몰랐어요! –

답변

3

당신의 ||&&해야한다 - 어떤 일이의 것은 당신이 처음 두 가지 조건이 false로 평가하는 것 null 값을 전달하지만, 때 그때는 점입니다 세 번째 및 네 번째 조건으로 진행하여 예외가 발생합니다. ||&&으로 변경하면 단락 회로 평가로 인해 세 번째 및 네 번째 조건이 평가되지 않습니다.

단락 회로 평가를 사용하는 이 아닌 &&을 사용해야하지만 후자는 세 번째와 네 번째 조건을 평가하여 강제로 널 포인터 예외가 발생합니다. condition1 && condition2은 "condition1이 거짓이면 false를 반환하고 그렇지 않으면 condition2를 평가합니다."- condition1이 false이면 condition2가 평가되지 않는다고 말합니다. 반대로 condition1 & condition2은 항상 두 조건을 모두 평가합니다. &을 사용하는 유일한 이유는 조건에 부작용이있는 경우입니다. 마찬가지로 condition1 || condition2은 조건 1이 참일 경우 조건 2를 평가하지 않지만 |은 항상 두 조건을 모두 평가합니다.

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하지 제로 또는 crimeLongLocationnull하지 zero없는 것을 말한다로 변경.

&을 사용하면 &&을 사용할 때 식의 첫 번째 부분이 false 인 경우 테스트가 단락됩니다.

1

비교하기 전에 null 값을 확인해야합니다. 이 기능을 사용하여 비교할 수 있습니다. 부울 논리가 그 변화에 더 잘 작동합니다 - 그들은`&&`해야합니다 -

/** 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; 
}