Java:如何修复此NPE?

时间:2013-11-05 05:21:51

标签: java arraylist nullpointerexception

所以我正在使用集合设计模式并正在使用数组列表。每当我尝试在数组列表中添加内容时,我都会获得一个NPE。我可能错误地实现了集合,因此NPE。

我不想复制我的整个代码,因为它太长了,所以我试图给你所有的SSCCE。我不认为ObjectA.java和Objects.java的内容是必要的,因为在实现集合模式之前我没有得到任何NPE。 特别注意:我无法导入Java的迭代器。

//Game.java
public class Game {
    private World w;

    public Game() {
        w = new World();
        w.getList().add(new ObjectA()); //NPE here
    }
}

//World.java
public class World {
    private Collection list;

    public Collection getList() {
         return list;
    }
}

//Collection.java //I don't know what could cause the NPE so I show everything
public class Collection{
    private ArrayList<Objects> collection = new ArrayList<>(0);

    public Objects get(int i) {
        return collection.get(i);
    }
    public Objects remove(int i){
        return collection.get(i);
    }
    public int size() {
        return collection.size();
    }
    public void add(Objects o) {
        collection.add(o);
    }
    public Iterator getIterator() {
        return new CollectionIterator();
    }

    public class CollectionIterator {
       private int index;

       public CollectionIterator() {
           index--;
       }
       public boolean hasNext() {
           if (collection.size() <= 0 || currElementIndex == collection.size() - 1) return false;
           return true;
       }
       public Object getNext() {
           index++;
           return collection.get(index);
       }
       public void remove() {
           collection.remove(index);
           index--;
       }
   }
}

3 个答案:

答案 0 :(得分:1)

因为World类中的列表尚未初始化。

private Collection list; // Not yet initialized

因此,w.getList()会返回一个未初始化的列表,当您在其上调用add()时会抛出NPE。

您需要在使用之前初始化列表。

private Collection list =  new ArrayList();

答案 1 :(得分:1)

问题是World.list未初始化。如下所示更改世界级:

public class World {
    private final Collection list = new ArrayList();

    public Collection getList() {
         return list;
    }
}

答案 2 :(得分:0)

您已在World课程中声明但从未初始化您的列表:

private Collection list;

尝试将其替换为:

private Collection list = new Collection();