【问题标题】:How do you add to an ArrayList using generics?如何使用泛型添加到 ArrayList?
【发布时间】:2020-03-03 19:47:28
【问题描述】:

我正在为我的一项任务而苦苦挣扎,我不知道如何将另一个元素添加到我的列表中。

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

【问题讨论】:

  • 您没有初始化ballot ArrayList 字段。您在构造函数中声明了一个本地 ballot 变量并对其进行初始化。

标签: java generics arraylist nullpointerexception


【解决方案1】:

构造函数初始化一个名为ballot 的局部变量,该变量隐藏同名数据成员。然后,当您尝试添加它时,它会失败并显示NullPointerException,因为它从未被初始化。如果你初始化它,你应该没问题:

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

【讨论】:

    【解决方案2】:

    您没有在 Ballot 构造函数中正确初始化候选列表。你需要做的:

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

    现在,您只是在构造函数中创建了一个名为 ballot 的局部变量,它隐藏了实际的类字段。由于它从未被初始化,因此当您最终尝试向其添加元素时,您最终会得到 NullPointerException

    此外,作为最佳实践,使用接口而不是具体类型。这使得以后更改实现变得容易。因此,不要将字段定义为private ArrayList&lt;Candidate&gt; ballot;,而是将其定义为private List&lt;Candidate&gt; ballot;

    【讨论】:

      【解决方案3】:

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

      正确的方法

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

      【讨论】:

        【解决方案4】:

        您正在使用同名的局部变量覆盖您的类变量。要么直接初始化列表

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

        或在构造函数中使用

        对其进行初始化
        ballot = new ArrayList<>();
        

        仅供参考:如果可以提供帮助,则不应为局部变量和返回值分配实现类。 “选票”应该只是 List 接口,getter 也应该是。这样,如果您想更改实现,就不必更改所有内容。它可以是 ArrayList、LinkedList、Stack、Vector 等,这无关紧要,因为它们都使用 List 接口。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-22
          • 2016-12-14
          • 2018-05-28
          • 2012-12-27
          • 2014-06-06
          • 2016-05-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多