[英]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.