【问题标题】:Why do my variables all disappear in this method?为什么我的变量在这种方法中都消失了?
【发布时间】:2020-01-29 16:42:29
【问题描述】:

我正在尝试使用 CardController 类创建一副牌。

Card 类(不可见)代表单独的卡片,并带有构造函数public Card(String cardValue, CardType cardType)

在我的deckIndexTracker 达到 10 之前,我的卡片组已正确填写,此时代码将移动到 switch 语句以填写卡片值

杰克、王后、国王和王牌。

使用 Eclipse 的调试工具后,我发现我的每一个变量在方法超过deckIndexTracker 9 后都消失了。

这里会发生什么?

public class CardController {
    public static Card[] makeDeck() {//2 to 10 + J,Q,K,A
        Card[] deck = new Card[51];
        int deckIndexTracker = 1;
        while(deckIndexTracker <= 13) {
            if(deckIndexTracker <= 9) {
            deck[deckIndexTracker - 1] = new Card(String.valueOf(deckIndexTracker + 1), CardType.HEART);
            deckIndexTracker++;             
            }else {
                switch(deckIndexTracker) {
                case 10:
                    deck[deckIndexTracker - 1] = new Card("Jack", CardType.HEART);
                    break;
                case 11:
                    deck[deckIndexTracker - 1] = new Card("Queen", CardType.HEART);
                    break;
                case 12:
                    deck[deckIndexTracker - 1] = new Card("King", CardType.HEART);
                    break;
                case 13:
                    deck[deckIndexTracker - 1] = new Card("Ace", CardType.HEART);
                }
            }
        }

【问题讨论】:

  • 你只增加deckIndexTrackerif is true。为什么不使用int deckIndexTracker = 0 并将-1deck 的索引中删除?
  • 这不应该是无限循环吗?
  • deckIndexTracker如果其值 > 9 则不递增
  • 推荐使用for 循环而不是显式增加索引。

标签: java


【解决方案1】:

您的 while loop 看起来像是一个无限循环,因为您在 10 之后停止增加 deckIndexTracker 的值。

您可以使您的代码更简单。仅使用开关:

int deckIndexTracker = 2; 
//start from 2, 
//because the case where value is equal with 9
//you add new Card("9 + 1",...) which should be "Jack" in my opinion.
//start from 2 -> add value of index in Card, but remove 2 at deck index.

while(deckIndexTracker <= 13) {

    switch(deckIndexTracker) {

        case 10:
            deck[deckIndexTracker - 2] = new Card("Jack", CardType.HEART);
            break;

        case 11:
            deck[deckIndexTracker - 2] = new Card("Queen", CardType.HEART);
            break;

        case 12:
            deck[deckIndexTracker - 2] = new Card("King", CardType.HEART);
            break;

        case 13:
            deck[deckIndexTracker - 2] = new Card("Ace", CardType.HEART);
            break;

        default:
            deck[deckIndexTracker - 2] = new Card(String.valueOf(deckIndexTracker), CardType.HEART);
            break;

    }

    deckIndexTracker++;

}

如果您只对这部分代码使用deckIndexTracker,我建议使用for loop

for(int deckIndexTracker = 2; deckIndexTracker <= 13; deckIndexTracker++){

    switch(deckIndexTracker){

        //same like in while

    }

}

【讨论】:

    【解决方案2】:

    在我看来,你一开始就走错了路。在构造牌组时,与其使用switch 语句,不如在Card 的构造函数中使用switch 更有意义。然后Card 可以轻松处理构造函数内部的不同情况,这将使您的代码更加可重用。

    Card 类看起来像这样:

    private String cardVal;
    private CardType suit;
    
    public Card(int value, CardType suit){
    
        switch(value)
        {
            case 1:
            case 14:
                this.cardVal = "Ace";
                break;
            case 11:
                this.cardVal = "Jack";
                break;
            case 12:
                this.cardVal = "Queen";
                break;
            case 13:
                this.cardVal = "King";
                break;
            default: //Default case that handles nonface cards
                this.cardVal = String.valueOf(value);
        }
        this.suit = suit;
    }
    

    然后看看你可以多么容易地用每套西装构建整个套牌:

        ArrayList<Card> deck = new ArrayList<>();
    
        for (int deckIndexTracker = 2; deckIndexTracker <= 14; deckIndexTracker++)
        {
            deck.add(new Card(deckIndexTracker, CardType.HEART));
            deck.add(new Card(deckIndexTracker, CardType.CLUB));
            deck.add(new Card(deckIndexTracker, CardType.SPADE));
            deck.add(new Card(deckIndexTracker, CardType.DIAMOND));
        }
    

    使用构造函数对你有利!我什至举了一个例子,Ace 用于114

    【讨论】:

      【解决方案3】:

      您需要在 else 语句的末尾添加 deckIndexTracker++ 以便它继续运行,而不会在 Jack 处停止。或者,您可以在 while 循环的末尾添加它并删除 if 语句中的那个。

      【讨论】:

        【解决方案4】:

        您正在增加if()deckIndexTracker 的值,因此一旦控制转到else 部分,变量就不会增加。

        添加

        deckIndexTracker++;

        if-else 之后在while 循环中。

        【讨论】:

          【解决方案5】:

          上面代码的问题是#deckIndexTracker++; 的位置。它在 if 块中。 直到deckIndexTracker=9,它才能正常工作。一旦deckIndexTracker = 10,它将进入else块,并且deckIndexTracker计数不会增加,它将保持10。因此它将成为无限循环。 解决方案:放置#deckIndexTracker++;在 if-else 块之后

          【讨论】:

            猜你喜欢
            • 2016-02-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-11
            • 2014-12-06
            • 2015-05-25
            • 2020-12-12
            相关资源
            最近更新 更多