Java 对象!=空验证
这是验证传递null的对象是否正确,还是应该使用一种equals()方法Java 对象!=空验证,java,Java,这是验证传递null的对象是否正确,还是应该使用一种equals()方法 在比较参考时,应使用=。使用equals将引发异常。如果您只想验证正在添加的卡是否不是null,您的代码将正常工作。您只需确保在调用addCard时处理IllegalArgumentException,这是正确的,但我个人会反过来构造它。通常在方法开始时验证参数,然后在方法的其余部分使用它们,知道它们是正确的: public void addCard(Card card) { if (card == null) {
在比较参考时,应使用
=代码>。使用equals
将引发异常。如果您只想验证正在添加的卡是否不是null
,您的代码将正常工作。您只需确保在调用addCard
时处理IllegalArgumentException
,这是正确的,但我个人会反过来构造它。通常在方法开始时验证参数,然后在方法的其余部分使用它们,知道它们是正确的:
public void addCard(Card card) {
if (card == null) {
throw new IllegalArgumentException("Attempt to add null card");
}
cardList.add(card);
}
提前进行所有参数测试的好处是,如果向您传递了无效参数,您将在任何副作用发生之前抛出异常,而不是在方法中途抛出异常,这可能会使对象处于无效状态。当然,在这种情况下,这并不重要,但我赞成这里的一致性:)
请注意,不需要声明IllegalArgumentException
——它是RuntimeException
的一个子类,这意味着它是未选中的(您不需要声明它)。我更喜欢这样做:
/**
* 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);
}
它的代码读起来更少
它将错误条件与预期条件分开(无其他=无缩进)
没有人需要查看X行上的内容才能看到card变量为null=人们搜索错误的时间更短
不需要用无用的throws语句将代码弄得乱七八糟-您应该使用@throws子句对其进行javadoc
除此之外,在我看来,你做得对。你可以使用class。它使您的代码更短、更简单:
public void addCard(Card card) {
Validate.notNull(card);
cardList.add(card);
}
它将抛出带有默认消息的IllegalArgumentException
(如果愿意,您可以将自定义消息作为第二个参数传递)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,因为您的参数不仅仅是不正确的,而是空的。第三,您可以在javadoc中指定参数,它们可以为null,也可以不为null。您不应该处理异常-您应该简单地避免传入null。IllegalArgumentException应该永远不会被显式捕获。这是一个很好的观点。我的主要观点是,这将是一个足以验证的检查。我只是认为处理这些异常通常会更好,这样用户就不会看到应用程序崩溃,但这取决于具体情况。谢谢您的评论。不确定我是否收到第四份声明。你的意思是我不必在这里抛出异常吗?@AndroidNoob-你需要抛出异常,你不需要声明你抛出了它public void addCard(Card Card)
本身就足够了,因为IllegalArgumentException是一个运行时异常。@DJClayhworth-lol!Jon和我过去常去Java新团队参观,那时。。。事实上,我直到现在才看到乔恩给出的答案——但我同意他的说法!NullPointerException永远都是一个bug。IllegalArgumentException更好。@Horcrux7:Joshua Bloch不同意您的观点,将null
传递给addCard方法是一个错误,正如方法契约中所记录的那样-通过@param语句“cannot be null”使用NullPointerException很有趣。我一直怀疑,直到我检查了NPE的javadoc,它实际上声明“应用程序应该抛出这个类的实例,以指示null对象的其他非法使用。”@Stephen-P:将null传递给addCard当然也是一个bug。我公司的编码规则禁止新的NullPointerException。我觉得这样很好。Java中的NPE类似于C中的访问冲突。我更喜欢IllegalArgumentException而不是NullPointerException,因为很明显该参数有一个意外的值。如果卡为空,则还应具有@throws NullPointerException。这也意味着关于null的@param注释应该消失。+1:将测试放在顶部也是一种文档
/**
* 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);
}