日期:2014-05-20  浏览次数:20835 次

为什么下边代码e.getName()会报空指针异常,而entry.get(0).getName()不会?
public static void main(String[] args) throws Exception {
List<Entry> entry = new ArrayList<Entry>();
Entry e = new Entry();
entry.add(e);
e.setName("huangqx");
System.out.println(entry.get(0).getName());

e = null;
//System.out.println(e.getName());
System.out.println(entry.get(0).getName());

}


------解决方案--------------------
你的Entry的代码呢??贴出来看看
------解决方案--------------------
“e=null;”, 这句使 e 不指向任何对象了,再用它去调用getName(),就会抛异常了。
------解决方案--------------------
集合里拿有e 了啊?
------解决方案--------------------
你是通过entry.get(0)得到了先前放进去的Entry对象的。
------解决方案--------------------
只是list里面的Entry对象为空,对Entry方法的调用应该没有影响。
------解决方案--------------------
集合里的泛型和你现在新new的对象e不是同一个对象,
e你赋值为null,并不意味着集合里的也变成了null.

e和entry 是两个不同的对象,所以才会出现那个结果。
------解决方案--------------------
楼主没搞清楚,啥是对象引用啊。
Entry e = new Entry();
entry.add(e);
e = null;这个e只是 new Entry()对象的一个引用。
所以entry.add(e);是把e指向的那个对象加入到 list 中去。
然后e = null;e不指向那个对象了,但是那个对象依然是存在的,被添加到了list中了;
------解决方案--------------------
探讨
集合里放的是对象的引用:

楼主没搞清楚,啥是对象引用啊。
Entry e = new Entry();
entry.add(e);
e = null;这个e只是 new Entry()对象的一个引用。
所以entry.add(e);是把e指向的那个对象加入到 list 中去。
然后e = null;e不指向那个对象……

------解决方案--------------------
引用类型赋值问题。
你分析下内存结构就明白了。

new Entry();这个在堆内存中的对象被两个变量所引用,一个是e,另一个是集合的第一个元素。你把e=null,e不再指向这个对象,所以e.getName()报空,集合元素那个引用还在,所以没问题,用集合的remove方法就么有了。
------解决方案--------------------
探讨
集合里放的是对象的引用: