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

解决方案 »

  1.   

    你的Entry的代码呢??贴出来看看
      

  2.   

    Entry很简单就是package com.test;public class Entry { private String name; public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } @Override
    protected void finalize() throws Throwable { System.out.println("invoke finalize");
    }
    }
      

  3.   

    “e=null;”, 这句使 e 不指向任何对象了,再用它去调用getName(),就会抛异常了。
      

  4.   

    那为什么在集合里的e可以getName呢
      

  5.   

    你是通过entry.get(0)得到了先前放进去的Entry对象的。
      

  6.   

    只是list里面的Entry对象为空,对Entry方法的调用应该没有影响。
      

  7.   

    集合里的泛型和你现在新new的对象e不是同一个对象,
    e你赋值为null,并不意味着集合里的也变成了null.e和entry 是两个不同的对象,所以才会出现那个结果。
      

  8.   

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

  9.   

    你不是已经使用了e=null肯定是空了啊
      

  10.   

    java是值传递(虽然这个有争议),entry.add(e)方法内部会有一个生成一个跟e相同指向的拷贝,并加入到数组里面去,所以你可以通过e修改值,如e.setName("huangqx");因为他们是都是同一对象的引用,这时候你在外部使e = null就断开了到实体的引用,但是不会影响List自己的。所以会出现这个效果。
      

  11.   

    引用类型赋值问题。
    你分析下内存结构就明白了。new Entry();这个在堆内存中的对象被两个变量所引用,一个是e,另一个是集合的第一个元素。你把e=null,e不再指向这个对象,所以e.getName()报空,集合元素那个引用还在,所以没问题,用集合的remove方法就么有了。