Java 如何使用泛型添加到ArrayList?

Java 如何使用泛型添加到ArrayList?,java,generics,arraylist,nullpointerexception,Java,Generics,Arraylist,Nullpointerexception,我正在努力完成我的一项任务,但我不知道如何将另一个元素添加到我的列表中 import java.util.ArrayList; public class Ballot { private ArrayList<Candidate> ballot; private String officeName; public Ballot(String officeName) { this.officeName = officeName;

我正在努力完成我的一项任务,但我不知道如何将另一个元素添加到我的列表中

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。我做错了什么

您没有在选票构造函数中正确初始化您的候选人列表。您需要执行以下操作:

this.ballot = new ArrayList<Candidate>();
现在,您只需在构造函数中创建一个名为ballot的局部变量,该变量会隐藏实际的类字段。因为它从未被初始化过,所以当您最终尝试向它添加元素时,会得到一个NullPointerException


此外,作为最佳实践,使用接口而不是具体类型。这使得以后更改实现变得很容易。因此,与其将字段定义为私有ArrayList选票;,将其定义为私有列表投票

很简单,您不使用此对象。你永远不会初始化你的对象

正道

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

构造函数初始化名为ballot的局部变量,该变量隐藏具有相同名称的数据成员。然后,当您尝试添加到它时,它会失败并出现NullPointerException,因为它从未初始化过。如果您对其进行了初始化,您应该可以:

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

您正在使用同名的局部变量重写类变量。或者直接初始化列表

private List<Candidate> ballot = new Arraylist<>();
或者在构造函数中使用

ballot = new ArrayList<>();
仅供参考:如果可以的话,不应该为局部变量分配实现类和返回值。选票应该只是列表界面,就像getter一样。这样,如果您想要更改实现,就不必更改所有内容。它可以是ArrayList、LinkedList、Stack、Vector等,这并不重要,因为它们都使用列表界面。

您不需要初始化选票ArrayList字段。在构造函数中声明一个局部选票变量并初始化它。