【问题标题】:Using ArrayLists as static properties in classes?在类中使用 ArrayLists 作为静态属性?
【发布时间】:2012-02-05 12:06:36
【问题描述】:

有点挣扎。我已经建立了一个概念证明并用谷歌搜索但找不到原因。

  1. 我目前正在尝试使用 ArrayList 作为类中的静态属性来存储一系列条目。唯一的问题是,每次我尝试添加到 Totalentries 数组列表时,我都会得到一个 nullPointerError。

是否希望得到一些关于我哪里出错的指导?

我的班级:

import java.util.ArrayList;


public class Competition {
private static ArrayList totalentries;

public Competition(){


}
public void newEntry(){
    totalentries.add("an Entry");
}

}

我的测试代码:

public class testEntries {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Competition myComp=new Competition();
        myComp.newEntry(); //Null Pointer comes here!
        myComp.newEntry();
        myComp.newEntry();
        myComp.newEntry();
        myComp.newEntry();
        myComp.newEntry();

        myComp.toString();
    }

}

【问题讨论】:

  • 正如下面许多人所指出的(让我们看看有多少人回答了这个帖子!)——你永远不会实例化 ArrayList。为什么一开始是静态的?
  • 这个变量不应该是静态的。它的类型应该是 List.

标签: java oop arraylist


【解决方案1】:

您永远不会创建ArrayList。试试这个:

private static ArrayList totalentries = new ArrayList();

虽然最好使用泛型并获得编译时安全性:

private static ArrayList<String> totalentries = new ArrayList<String>();

由于此列表包含您不希望它被替换的属性,因此如果您像这样定义它会更好:

private static final ArrayList<String> totalentries = new ArrayList<String>();

实际上,这些都不是好主意,因为您可以让您的类的多个实例同时更改totalentries。如果这是您的意图,那么多个 Competitions 使用一个静态 totalentries 进行存储,那么您最好在单独的类中跟踪该数据。

如果您一次只使用一个Competition,请删除static 关键字。

【讨论】:

  • 感谢您提供惊人的详细帮助!我阅读了更多内容,现在看到了我的错误!
【解决方案2】:

列表必须在使用前创建,试试 totalentries = new ArrayList();

您还应该使用 List 代替 totalentries 变量,以允许将 ArrayList 与例如 LinkedList 交换。

【讨论】:

    【解决方案3】:

    totalentries 未初始化,它指向null。变成这样:

    private static List<String> totalentries = new ArrayList<String>();
    

    【讨论】:

      【解决方案4】:

      您从未在您的 Competition 课程中实例化 totalentries

      你需要这样的东西:

      private static ArrayList totalentries = new ArrayList();
      

      但是,请注意,我建议不要保持这种“静态”。否则,您创建的每个“竞赛”都将共享相同的条目列表,这可能不是您真正想要的。

      此外,使用接口声明您的类型,而不是使用类型进行实例化。您可能还想在此处使用泛型。所以更好(并遵循标准命名约定):

      private List<String> totalEntries = new ArrayList<String>();
      

      【讨论】:

      • 感谢您清理它。我做了更多的研究,现在更好地理解了这一点!谢谢:)
      猜你喜欢
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      相关资源
      最近更新 更多