有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java ArrayList为空,但为什么?

我试图将卡片添加到ArrayList deck中,但似乎不起作用(大部分代码都是oracle.com上的一个示例)。我可能在做一些非常愚蠢的事情,但我似乎找不到它。。代码如下:

public class Card {

    public enum Rank 
    {
        DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE,
        TEN, JACK, QUEEN, KING, ACE
    }

    public enum Suit
    {
        HEARTS, DIAMONDS, SPADES, CLUBS
    }

    private final Rank rank;
    private final Suit suit;
    private static final List<Card> deck = new ArrayList<Card>();

    public Card(Rank rank, Suit suit)
    {
        this.suit = suit;
        this.rank = rank;
    }
    // initializes deck
    public void initDeck()
    {
        for (Suit suit : Suit.values())
        {
            for (Rank rank : Rank.values())
            {
                deck.add(new Card(rank, suit));
            }
        }
    }
    // returns a copy of the deck    
    public static ArrayList<Card> newDeck()
    {
        return new ArrayList<Card>(deck);
    }

    public Rank getRank()
    {
        return rank;
    }

    public Suit getSuit()
    {
        return suit;
    }

    public String toString()
    {
        return rank +" of "+ suit;
    }

    public static void main(String[] args)
    {
        System.out.println(deck.toString());
    }

}

共 (5) 个答案

  1. # 1 楼答案

    您的问题是,您从未实际调用initDeck,因此deck仍然为空,就像静态初始值设定项运行时一样:

    private static final List<Card> deck = new ArrayList<Card>();
    

    其他问题:

    1. initDeck()是一个实例方法,但deck是一个静态引用
    2. initDeck()是卡上的一种方法
    3. deckCard的静态成员,但卡不拥有或定义卡组
    4. newDeck在静态的最后一副牌面前是毫无意义的
    5. 无论如何,卡片都不应该传递牌组

    简而言之,您的设计是一团糟的-您需要越来越认真地思考实体及其相互关系

  2. # 2 楼答案

    List<card>定义中的关键字final用于具有无法更改的起始值的对象

    检查它here

  3. # 3 楼答案

    很简单,在main方法中,您只是toString()一个空的ArrayList。您根本没有在main方法中调用initDeck()方法

    当您运行程序private static final List<Card> deck = new ArrayList<Card>(); 时,为deck分配了一个空的ArrayList

  4. # 4 楼答案

    非常可疑的是,您的deckprivate static final,您的init方法是publicnon-static。它可以初始化几次,并包含比您预期的更多的卡。您可能希望在静态块中进行初始化

    我会将守则改为:

    1. 使数据组public static final不可修改(通过集合)
    2. 在静态初始值设定项中复制init方法的主体,如下所示:
    static {
      for (Suit suit : Suit.values()) {
        for (Rank rank : Rank.values()) {
          deck.add(new Card(rank, suit));
        }
      }
    }
    
    1. 完全删除initDeck
  5. # 5 楼答案

    这是因为initDeck()没有在任何地方被调用。尝试用static替换public void initDeck()