为什么这会抛出空指针异常?

时间:2015-04-03 19:48:22

标签: java

我的代码:

static List<Object> data;
private void addItem(List<Object> list) {
    try {
        data = new ArrayList<Object>();
        list.add("test");
    } catch (Exception e) {
        e.printStackTrace();        
    }
}

public static void main(String[] args) {
    ListTest test = new ListTest();
    test.addItem(data);
}

以上代码抛出NullPointerException。下面的代码不会引发NPE。

static List<Object> data = new Vector<Object>();
private void addItem(List<Object> list) {
    try {
        list.add("test");
    } catch (Exception e) {
        e.printStackTrace();        
    }
}

public static void main(String[] args) {
    ListTest test = new ListTest();
    test.addItem(data);
}

上面的代码不会抛出NullPointerException。我不明白两者之间的区别。

1 个答案:

答案 0 :(得分:1)

即使您通过了data方法的引用,您在向data分配新列表的那一刻:

data = new ArrayList<Object>();

listdata引用现在指向2个不同的对象。在此作业之前,data设置为null,因此list。但在分配后,只有list设置为null。因此调用list.add()将导致NPE

在第二种情况下,data开始时不是null