[英]Enhanced For-Loop Gets Stuck
我有两个文件 PokerCards 和 Frame。
PokerCards is enumeration *my suits work fine*
enum Number {
Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King;
public static final Number[] numbers = Number.values();
public static Number getNumber(int n){
return Number.numbers[n];
}
}
private final Number number;
//constructor
public PokerCards(final Suit suit, final Number number){
this.suit = suit;
this.number = number;
}
public Number getNumber(){
return this.number;
}
下面是我的 GUI 框架。 我对西装的错误检查非常有效,但我的数字……没那么多。 我正在尝试使用增强的 for 循环来匹配相应的枚举
//card1Num is the value of the card such as Ace, Three, King and is recorded via a TextField via the GUI.
card1Num = card1TextFieldNum.getText();
if (card1Suit.equalsIgnoreCase("Diamonds")){
for (PokerCards.Number n : PokerCards.Number.values()) { //GETS STUCK
if(n.name().equals(card1Num)) {
card1 = new PokerCards(PokerCards.Suit.Diamonds, PokerCards.Number.valueOf(card1Num));
System.out.println("Card 1 good to GO");
card1Good = true;
} else {
JFrame popUpError2 = new JFrame();
JOptionPane.showMessageDialog(popUpError2, "Incorrect Input, Number Input for First Card is incorrect! Please double check" +
" your input", "ERROR", JOptionPane.ERROR_MESSAGE);
break;
}
}
除了增强的 for 循环外,一切都很好。 当我测试其他卡时,我会收到错误提示。 它只接受第一个元素“Ace”。 为什么我的增强型 for 循环卡住了?
问题是你应该只在没有卡片匹配时失败,而不是只有第一张卡片不匹配,所以你想将失败的代码移到循环之外,如下所示:
for (PokerCards.Number n : PokerCards.Number.values()) {
if(n.name().equals(card1Num)) {
card1 = new PokerCards(PokerCards.Suit.Diamonds, PokerCards.Number.valueOf(card1Num));
System.out.println("Card 1 good to GO");
card1Good = true;
}
}
if (!card1Good)
{
JFrame popUpError2 = new JFrame();
JOptionPane.showMessageDialog(popUpError2, "Incorrect Input, Number Input for First Card is incorrect! Please double check" +
" your input", "ERROR", JOptionPane.ERROR_MESSAGE);
}
for 循环工作正常,if/else 逻辑是在“Ace”以外的卡片上抛出错误背后的问题。
正如您自己提到的那样 - 如果您使用“Ace”,您的代码将正常工作,因为“Ace”是Number.values()
中的第一个元素,并且检查n.name().equals(card1Num)
将为true
,触发if
语句中的代码。 所有其他卡片都将失败并抛出错误,因为它们将首先与“Ace”匹配。 如果我正确理解您想做什么,我认为您应该使用findAny()
而不是for
循环。 代码将是这样的:
PokerCards.Number.values().stream().filter(number ->
number.name().equals(card1Num)).findAny().ifPresentOrElse(card ->
{your_if_logic_here},
{your_else_logic_here})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.