Затруднение в передаче ArrayList

Я пытаюсь реализовать имитацию игры в покер. Создал класс, в котором есть статический метод для создания игральной колоды (уникальность каждой карты реализовал через Enum и счетчик).

Для каждой партии игры должна "открыта" новая колода карт. В классе игры я создал ArrayList plaingDeck и 2 метода: create() и delete() соответственно. Но почему-то все элементы списка - null.

Код из класса PlaingDeck:

public static ArrayList<PlaingDeck> createNewPlaingDeck(){
            ArrayList<PlaingDeck> arrayPD = new ArrayList<>();
            for (int i = 0; i < 52; i++) {
                arrayPD.add(new PlaingDeck());
            }
            return arrayPD;
        }

Код из класса Play:

ArrayList<PlaingDeck> plaingDeck;
   
    private void createNewDeck(){
         plaingDeck = PlaingDeck.createNewPlaingDeck();

    }
    private void deleteDeck(){
        plaingDeck.clear();
    }

Сама ошибка при компиляции:

Cannot invoke "java.util.ArrayList.clear()" because "this.plaingDeck" is null

Класс Play полностью:

public class Play {
    ArrayList<PlaingDeck> plaingDeck;
    Random random = new Random();
    private void createNewDeck(){
         plaingDeck = PlaingDeck.createNewPlaingDeck();

    }
    private void deleteDeck(){
        plaingDeck.clear();
    }
// метод cardDistribution еще не реализован, он ни где не участвует
    private void cardDistribution(Players players){
        for (int i = 0; i < Players.arrayListPlayers.size(); i++) {
            for (int j = 0; j < players.cardInHand.size(); j++) {
                players.cardInHand.set(j, getRandomCard());
            }
        }
    }
// метод getRandomCard тоже пока не реализован
    private PlaingDeck getRandomCard(){
        return  null;
    }

    public static void main(String[] args) {
        Play play = new Play();
        Players.createPlayers(4);
        play.createNewDeck();
        for (int i = 0; i < play.plaingDeck.size(); i++) {
            System.out.println(play.plaingDeck.get(i));
        }
  //      for (Players players: Players.arrayListPlayers) play.cardDistribution(players);
//        for (Players players: Players.arrayListPlayers) players.showCardinHand();
    }
}

Ответы (1 шт):

Автор решения: versetty777

Думаю plaingDeck не инициализирована никаким значением перед вызовом метода deleteDeck(). Вы пытаетесь очистить список, который равен null. Вам нужно инициализировать plaingDeck до вызова метода deleteDeck(), например, в конструкторе класса Play. Примерно так:

public class Play {
    ArrayList<PlaingDeck> plaingDeck = new ArrayList<PlaingDeck>();
    // ...
}

Также рекомендую интерфейс List вместо конкретной реализации ArrayList, чтобы ваш код был более гибким:

List<PlaingDeck> plaingDeck = new ArrayList<PlaingDeck>();

Или вы создаете PlaingDeck в статическом методе createNewPlaingDeck(), но не инициализируете их никакими значениями. Это может приводить к тому, что элементы списка равны null.

Если это так, то вам нужно инициализировать PlaingDeck в цикле for в статическом методе createNewPlaingDeck()

public static ArrayList<PlaingDeck> createNewPlaingDeck(){
            ArrayList<PlaingDeck> arrayPD = new ArrayList<>();
            for (int i = 0; i < 52; i++) {
                arrayPD.add(new PlaingDeck());
            }
            return arrayPD;
        }

Или

private void createNewDeck(){
         plaingDeck = new ArrayList<PlaingDeck>();
         for (int i = 0; i < 52; i++) {
                plaingDeck.add(new PlaingDeck());
            }
    }
→ Ссылка