0

Я пытаюсь реализовать имитацию игры в покер. Создал класс, в котором есть статический метод для создания игральной колоды (уникальность каждой карты реализовал через 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 &lt; 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(); } }

Зонтик
  • 2,262
  • 2
  • 11
  • 39
  • "При реализации кода происходит ошибка" - приведите, пожалуйста, эту реализацию. – Byb Jan 26 '23 at 10:06
  • Забыл сказать при создание new PlaintDeck, реализовал счетчик в конструкторе, тем самым хочу сказать что при вызове конструктора там создается новая карта по порядку возрастанию и масти. (но не как не null) – ЛоуСкильныйДевелопер Jan 26 '23 at 10:06
  • Создаю экземпляр класса Play Play play = new Play(); play.createNewDeck(); т.е тем самым передаю списку plaingDeck новые значения: пытаюсь просмотреть содержания списка plaingDeck:

    play.createNewDeck(); for (int i = 0; i < play.plaingDeck.size(); i++) { System.out.println(play.plaingDeck.get(i)); }

    – ЛоуСкильныйДевелопер Jan 26 '23 at 10:10
  • 1
    Ошибка не в том, что карты в колоде null, а в том, что сама колода - null, то есть, вы её не создаёте. Где вызывается метод createNewDeck()? Вы можете отредактировать вопрос, дополнив его всем кодом из класса Play, а то, как видно, методы в нём закрытые, и поэтому вызывать вы их можете только в рамках данного класса. – Byb Jan 26 '23 at 10:14
  • 1
    Ошибка, которую вы привели в вопросе, возникает явно при вызове метода deleteDeck(). В коде, который вы привели здесь в комментарии, этой ошибки возникнуть не может. Опять же, добавьте в вопрос весь код класса Play. – Byb Jan 26 '23 at 10:23
  • Я специально сделал методы в классе Play закрытыми. – ЛоуСкильныйДевелопер Jan 26 '23 at 10:32
  • 1
    @Fobos1996, в представленном коде ваша проблема не воспроизводится. Ошибка у вас возникает не при компиляции, а при выполнении кода (runtime) из-за того, что метод deleteDeck вызван до инициализации поля plaingDeck. – Nowhere Man Jan 26 '23 at 11:01

1 Answers1

-1

Думаю 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());
            }
    }
versetty777
  • 1,026
  • 1
  • 2
  • 12
  • Я к сожалению не совсем вас понял, вы утверждаете что не происходит заполнения списка из-за метода deleteDeck(); я его создал для последующей очистки списка после всех его операций (например раздача карт игрокам и раздача карт на игральный стол) и только после как победитель определен я хотел очищать список-колоду я генерации новой колоды. – ЛоуСкильныйДевелопер Jan 26 '23 at 10:45