我正在尝试实现一个拥有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;
}
答案 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;
}
}
改变推理:
checkCorectness
是该方法的一个非常糟糕的名称。应该命名boolean
方法,以便其返回值表示的状态立即显而易见。作为一个更极端的例子,您期望checkIfNotX(x)
返回什么?该方法应该命名为它返回的内容,而不是它的作用。 isValidHand
是一个更好的名字。isValidHand
应为public
,因为该类用户可能希望遵循“先检查”模式而不是“请求原谅”模式。isValidHand
不应该抛出异常,原因应该是public
。cards
应该是一个数组,因为您对它们所做的一切都不需要List
的任何动态功能。isValidHand
和Pokerhand
应该采用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
切换为可以为您提供更多信息的内容,例如int
或enum
(首选)并返回错误代码。
如果我们选择int
而不是考虑这个:
-1 = "Incorrect number of cards"
-2 = "Duplicate card"
示例:
private int checkCorrectness(ArrayList<Card> cards)