簡體   English   中英

增強型 For 循環卡住

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM