Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象!=空验证_Java - Fatal编程技术网

Java 对象!=空验证

Java 对象!=空验证,java,Java,这是验证传递null的对象是否正确,还是应该使用一种equals()方法 在比较参考时,应使用=。使用equals将引发异常。如果您只想验证正在添加的卡是否不是null,您的代码将正常工作。您只需确保在调用addCard时处理IllegalArgumentException,这是正确的,但我个人会反过来构造它。通常在方法开始时验证参数,然后在方法的其余部分使用它们,知道它们是正确的: public void addCard(Card card) { if (card == null) {

这是验证传递null的对象是否正确,还是应该使用一种equals()方法


在比较参考时,应使用
=。使用
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);
        }