为什么我没有得到NullPointerException

时间:2014-02-19 18:41:47

标签: java exception object null

为什么,当我添加一个对象时,我的ArrayList,它应该传递给对象的引用,然后我使对象等于null,它输出完全正常。

    ArrayList<Test> testList = new ArrayList<>();

    Test test = new Test();
    System.out.println(test);

    testList.add(test);

    for(Test t : testList)
    {
        System.out.println(t);
    }

    test = null;

    for(Test t : testList)
    {
        System.out.println(t);
    }

测试构造函数如下:

int x = 0;

Test()
{
    x = 50;
}

public String toString()
{
    return x + "";
}

然而,输出是50,50,50 而不是50,50,null

3 个答案:

答案 0 :(得分:3)

当您致电add时,ArrayList现在拥有对同一对象的引用。

test ----> Test() object
             ^
testList ----|

将参考test设置为null,不受影响。

test ----> null

testList ----> Test() object

答案 1 :(得分:2)

因为Java中的引用类型和值类型之间存在差异。

您将值(a.k.a.对象)的引用添加到列表中,然后删除引用。但是值仍然存在于内存中,并且列表仍然具有对该值的引用,尽管您的原始引用无效

答案 2 :(得分:1)

当您将对象的引用传递给ArrayList时,您实际上创建了另一个ArrayList用来引用该对象的引用。

当您将null分配给变量test时,实际上“取消”了您的参考。参考数组列表没有任何反应。

更简单。

如果您有两个变量:一个和两个:

Test one = new Test()
Test two = one;

此时两个引用都指向同一个对象。

one = null;

现在one为空,但two仍然引用该对象。