2013-04-10 7248 views
1

我想驗證數據類型BigDecimal在Java中的空值。我能夠驗證0值,但是空值導致NULL點異常。我是否應該在異常中處理此數據類型的驗證,或者是否有一些計算可以對數據進行預處理以驗證它。下的是我迄今所做的一個例子:驗證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)'。 – 2013-04-10 21:02:51

+2

@RobI你不應該在'BigDecimal'中使用'.equals',因爲這需要考慮精度,所以'0.00'不等於''0'。 'compareTo'是正確的方法。 – 2013-04-10 21:09:32

+0

謝謝,@ bmorris591 - 我不知道! – 2013-04-11 02:35:24

回答

3

||應該是一個&& - 發生了什麼事是,當你在它的評估,以虛假的前兩個條件,一個空值傳遞,但那麼它的繼續進行第三和第四個條件並導致例外。如果將||更改爲&&,則短路評估將阻止評估第三和第四個條件。

確定使用&&而不是& - 前者使用短路評估,但後者會強制第三個和第四個條件進行評估,您將再次獲得空指針異常。 condition1 && condition2表示「如果condition1爲false,則返回false,否則評估condition2」 - 如果condition1爲false,則不會評估condition2。相反,condition1 & condition2將始終評估這兩個條件。如果條件有副作用,使用&的唯一原因是。同樣,如果條件1爲真,condition1 || condition2將不會評估條件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)) 

這是說,要麼crimeLatLocationnull而不是零或crimeLongLocationnull而不是zero

當您使用&然後評估表達式的兩側,當您使用&&時,如果表達式的第一部分是false,則測試會短路。

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