Затруднение в передаче 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 шт):
Думаю 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());
}
}