object!= null验证

时间:2010-10-27 19:20:25

标签: java

这个验证是否对象传递null是否正常或者我应该使用一种equals()方法?

public void addCard(Card card) throws IllegalArgumentException {
        if (card != null){
            cardList.add(card);
        } else {
            throw new IllegalArgumentException();
        }
    }

6 个答案:

答案 0 :(得分:21)

这是正确的,但就我个人而言,我会以相反的方式构建它。在方法开始时验证参数是很常见的,然后在知道它们正确的方法的其余部分使用它们:

public void addCard(Card card) {
    if (card == null) {
        throw new IllegalArgumentException("Attempt to add null card");
    }
    cardList.add(card);
}

预先进行所有参数测试的好处是,如果向您传递了无效参数,您将在发生任何副作用之前抛出异常 - 而不是通过该方法的一半,这可能将对象保持无效状态。当然在这种情况下没关系,但我赞成这里的一致性:)

请注意,无需声明IllegalArgumentException - 它是RuntimeException的子类,这意味着它未经检查(您无需声明它)。

答案 1 :(得分:17)

我更喜欢这样做:

/**
 * Adds a card to the deck.
 *
 * @param the card to add.
 * @throws IllegalArgumentException if the card is null.
 */
public void addCard(final Card card) 
{
    if(card == null)
    {
        throw new IllegalArgumentException("card must not be null");
    }

    cardList.add(card);
}
  1. 阅读的代码较少
  2. 它将错误条件与预期条件(no else = no indent)
  3. 分开
  4. 没有人需要查看X行上的内容,看看卡片变量是否为null =人们搜索的时间越来越少,以找出他们做错了什么。
  5. 不需要用无用的throws语句来混淆代码 - 你应该用@throws子句javadoc它
  6. 除此之外,在我看来,你做得对。

答案 2 :(得分:6)

Josh Blosh的有效Java推荐如下:

/**
 * ads a card to card list.
 * 
 * @param card card to add. Can not be null
 * 
 */
public void addCard(Card card) {
      if (card == null) {
           throw new NullPointerException("Card can not be null")
      }  
      cardList.add(card);
    }

因此,首先您不要声明RuntimeException。其次,你抛出一个NullPointerException,因为你的参数不是简单的错误 - 它是null。第三,你在javadoc中指定参数,它们是否为null。

答案 3 :(得分:5)

您可以使用commons-lang Validate课程。它使您的代码更简短:

public void addCard(Card card) {
    Validate.notNull(card);
    cardList.add(card);
}

它将抛出一个带有默认消息的IllegalArgumentException(如果您愿意,可以将自定义消息作为第二个参数传递)

答案 4 :(得分:3)

在比较参考时,您应该使用!=。使用equals会抛出异常。

答案 5 :(得分:1)

如果您只是想验证添加的卡不是null,那么您的代码将正常运行。您只需要确保在致电IllegalArgumentException时处理addCard