【问题标题】:Validating BigDecimal data type for nulls In Java在 Java 中验证空值的 BigDecimal 数据类型
【发布时间】:2013-04-10 20:59:10
【问题描述】:

我正在尝试验证 java 中数据类型 BigDecimal 的 NULL。我能够验证 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');
    }

【问题讨论】:

  • 你有两个& - 他们应该是&& - 布尔逻辑应该更好地适应这种变化。此外,如果您将纬度/经度比较分开,布尔逻辑可能会更清晰并且可能会更好地工作。此外,您可能希望使用equals(BigDecimal.ZERO),而不是使用compareTo() != 0
  • @RobI 你不应该将.equalsBigDecimal 一起使用,因为这会考虑到精度,所以0.00 没有equals 0compareTo 是正确的方法。
  • 谢谢,@bmorris591 - 我不知道!

标签: java validation bigdecimal


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你的测试在这里

    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,则测试被短路。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        yourBigDecimal != null.
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-23
          • 2012-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多