比较扑克手中的两张牌

时间:2014-01-29 13:22:03

标签: java class exception-handling

我正在尝试实现一个拥有5张卡阵列的扑克手类,我需要检查是否有任何重复的卡片。这是代码,但它给了我一条错误消息,说明在最后if语句:丢失的返回类型!我不知道那是什么意思。这是一个if语句。为什么我需要返回类型?!

import java.util.ArrayList;

public class Pokerhand {

   public final int CARDS_NUMBER = 5;
   private ArrayList<Card> cards = new ArrayList<Card>();

   public Pokerhand(Card card1, Card card2, Card card3, Card card4, Card card5) {
      cards.add(card1);
      cards.add(card2);
      cards.add(card3);
      cards.add(card4);
      cards.add(card5);
   }

   private boolean checkCorrectness(ArrayList<Card> cards) {
      if (cards.size() != CARDS_NUMBER)
         throw new IllegalArgumentException("Incorrect number of cards!! ");

      for (int i = 0; i < cards.size() - 1; i++) {
         for (int j = i + 1; j < cards.size(); j++) {
            if (cards.get(j).equals(cards.get(j + 1)))
               throw new IllegalArgumentException("Duplicat card");

         }
      }

      return true;
   }

   if (checkCorrectness (cards)) 
      this.cards = cards;
}

3 个答案:

答案 0 :(得分:2)

请你,你需要先解决一堆风格问题,甚至在你的逻辑被评估之前。一旦完成,逻辑问题就会变得明显:

import java.util.ArrayList;

/**
 * Represents a hand of cards in a game of Poker.
 */
public class Pokerhand {

    /**
     * The number of cards in a valid poker hand. Hands with other numbers of
     * cards are not considered valid.
     */
    public final int HAND_SIZE = 5;

    private Card [] cards;

    /**
     * Constructs a new hand containing the given cards.
     * @param cards The cards this hand is to contain.
     * @throws InvalidArgumentException if the cards passed do not form a valid
     *     hand.  A hand is considered valid if there are exactly
     *     {@code HAND_SIZE} cards, and no repeated cards.
     * @see Pokerhand#isValidHand
     */
    public Pokerhand(Card ... cards) throws InvalidArgumentException {
        if(isValidHand(cards)) 
            this.cards = cards;
        else
            throw new InvalidArgumentException("Bad hand");
    }

    /**
     * Checks if the cards passed together form a valid hand. A hand is
     * considered valid if there are exactly {@code HAND_SIZE} cards, and no
     * repeated cards.
     * @param cards The cards to check
     * @return {@code true} if the cards form a valid hand,
     *         {@code false} otherwise.
     */
    public boolean isValidHand(Card ... cards){
        if (cards.length != HAND_SIZE)
            return false;

        for(int i=0; i < cards.size()-1; i++)
            for(int j=i+1; j < cards.size(); j++)
                if(cards[j].equals(cards[j+1]))
                    return false;

        return true;
    }
}

改变推理:

  • 一切都应该有一个javadoc。
  • checkCorectness是该方法的一个非常糟糕的名称。应该命名boolean方法,以便其返回值表示的状态立即显而易见。作为一个更极端的例子,您期望checkIfNotX(x)返回什么?该方法应该命名为它返回的内容,而不是它的作用。 isValidHand是一个更好的名字。
  • isValidHand应为public,因为该类用户可能希望遵循“先检查”模式而不是“请求原谅”模式。
  • isValidHand不应该抛出异常,原因应该是public
  • cards应该是一个数组,因为您对它们所做的一切都不需要List的任何动态功能。
  • isValidHandPokerhand应该采用varargs,因为这种方式更加透明,并且使它们更易于使用。

现在,正如您所看到的,错误位于if中嵌套for循环内的isValidHand语句中。你的编译器应该给你一个警告,说永远不会使用i。条件应为cards[i].equals(cards[j])

答案 1 :(得分:1)

你的大括号搞砸了:最后两个语句看起来像是在class范围内,但你不能在类范围内有if语句:

    }  // end checkCorrectness(...)

    if (checkCorrectness (cards)) 
        this.cards = cards;
} // end class

重要规则:始终正确格式化您的代码,包括合理的缩进 - 这样可以更轻松地发现此类问题。

你可能想要在你的构造函数中添加它们之后检查它们的正确性 - 然后,删除上面提到的两行并改为做这样的事情:

public Pokerhand(Card card1, Card card2, Card card3, Card card4, Card card5) {
  cards.add(card1);
  cards.add(card2);
  cards.add(card3);
  cards.add(card4);
  cards.add(card5);

  checkCorrectness (cards);  // throws exception if the card definition is wrong
}

这应该可以解决您在问题中显示的代码的直接问题。请参阅@ AJMansfield关于如何改进Pokerhand API的答案 - 构造函数中的参数太多通常是一种糟糕的API设计。

答案 2 :(得分:0)

如果您不打算在函数处理异常,则应明确将该函数标记为throws IllegalArgumentException

示例:

private boolean checkCorrectness(ArrayList<Card> cards) throws IllegalArgumentException

否则,您应该考虑将return-type切换为可以为您提供更多信息的内容,例如intenum(首选)并返回错误代码。

如果我们选择int而不是考虑这个:

-1 = "Incorrect number of cards"
-2 = "Duplicate card"

示例:

private int checkCorrectness(ArrayList<Card> cards)