这个验证是否对象传递null是否正常或者我应该使用一种equals()方法?
public void addCard(Card card) throws IllegalArgumentException {
if (card != null){
cardList.add(card);
} else {
throw new IllegalArgumentException();
}
}
答案 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);
}
除此之外,在我看来,你做得对。
答案 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
。