object!= null验证

Eug*_*ene 5 java

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

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

Jon*_*eet 21

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

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

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

请注意,不需要声明IllegalArgumentException- 它是子类RuntimeException,这意味着它未被选中(您不需要声明它).


Tof*_*eer 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);
}
Run Code Online (Sandbox Code Playgroud)
  1. 它的代码更少
  2. 它将错误条件与预期条件分开(no else = no indent)
  3. 没有人需要看到X行上的内容,看看卡片变量是否为null =人们寻找他们错误的时间的时间减少了.
  4. 不需要用无用的throws语句来混淆代码 - 你应该使用@throws子句对它进行javadoc

除此之外,在我看来,你做得对.


Vla*_*nov 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

  • NullPointerException是一个bug.IllegalArgumentException更好. (3认同)

Boz*_*zho 5

你可以使用commons-lang Validate类.它使您的代码更短更简单:

public void addCard(Card card) {
    Validate.notNull(card);
    cardList.add(card);
}
Run Code Online (Sandbox Code Playgroud)

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