在类中使用ArrayLists作为静态属性?

时间:2012-01-08 18:50:46

标签: java oop arraylist

有点挣扎。我已经建立了一个概念证明和谷歌搜索,但找不到理由。

  1. 我目前正在尝试使用ArrayList作为类中的静态属性来存储一系列条目。唯一的问题是每次我尝试添加到Totalentries arraylist我得到一个nullPointerError。
  2. 我会欣赏一些关于我哪里出错的指导意见吗?

    我的班级:

    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();
        }
    
    }
    

4 个答案:

答案 0 :(得分:1)

您从未在竞赛班中实例化totalentries

您需要以下内容:

private static ArrayList totalentries = new ArrayList();

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

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

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

答案 1 :(得分: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类的多个实例。如果这是您的意图,那么多个Competition使用一个静态totalentries进行存储,那么您最好在单独的类中跟踪这些数据。

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

答案 2 :(得分:0)

totalentries未初始化,并指向null。像这样:

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

答案 3 :(得分:0)

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

您还应该使用List代替totalentries变量,而不是允许使用例如LinkedList交换te ArrayList。