Как вы добавляете в ArrayList, используя дженерики? - PullRequest
0 голосов
/ 03 марта 2020

Я борюсь с моим заданием и не могу понять, как добавить еще один элемент в мой список.

import java.util.ArrayList;

public class Ballot {
    private ArrayList<Candidate> ballot;
    private String officeName;

    public Ballot(String officeName) {
        this.officeName = officeName;
        ArrayList<Candidate> ballot = new ArrayList<Candidate>();
    }

    public String getOfficeName() {
        return officeName;
    }

    public void addCandidate(Candidate c) {
        ballot.add(c);
    }

    public ArrayList<Candidate> getCandidates() {
        return ballot;
    }

    public static void main(String[] args) {
        Ballot b = new Ballot("Election");
        b.addCandidate(new Candidate("Sarah", "President"));
        System.out.println(b);
    }
}

Когда я пытаюсь запустить документ, он выдает NullPointerException. Что я делаю неправильно?

Ответы [ 4 ]

3 голосов
/ 03 марта 2020

Конструктор инициализирует локальную переменную с именем ballot, которая скрывает элемент данных с тем же именем. Затем, когда вы пытаетесь добавить к нему, он завершается с NullPointerException, так как он никогда не был инициализирован. Если вы инициализируете его, вы должны быть в порядке:

public Ballot(String officeName) {
    this.officeName = officeName;
    ballot = new ArrayList<Candidate>(); // Here!
}
1 голос
/ 04 марта 2020

Вы переопределяете переменную вашего класса локальной переменной с тем же именем. Либо инициализируйте список напрямую

private List<Candidate> ballot = new Arraylist<>();

, либо инициализируйте его в конструкторе с помощью

ballot = new ArrayList<>();

К вашему сведению: вам не следует назначать классы реализации для ваших локальных переменных и возвращать значения, если вы можете помочь Это. «ballot» должен быть просто интерфейсом List, как и получатель. Таким образом, если вы когда-нибудь захотите изменить реализацию, вам не нужно менять все. Это может быть ArrayList, LinkedList, Stack, Vector и т. Д. c, и это не имеет значения, поскольку все они используют интерфейс List.

1 голос
/ 03 марта 2020

Как просто, что вы не используете this объект. Вы никогда не инициализируете свой объект

Правильный путь

public Ballot(String officeName) {
    this.officeName = officeName;
    this.ballot = new ArrayList<Candidate>();
}
1 голос
/ 03 марта 2020

Вы неправильно инициализируете свой список кандидатов в конструкторе Ballot. Вам нужно сделать:

this.ballot = new ArrayList<Candidate>();

Прямо сейчас вы просто создаете локальную переменную с именем ballot в конструкторе, которая скрывает фактическое поле класса. Так как он никогда не был инициализирован, вы в конечном итоге получите NullPointerException, когда в конце концов попытаетесь добавить к нему элемент.

Также, в качестве лучшей практики, используйте интерфейсы вместо конкретного типа. Это облегчает изменение реализаций позже. Поэтому вместо определения поля как private ArrayList<Candidate> ballot; определите его как private List<Candidate> ballot;.

...