各位高手,下面这个程序调用了test2()方法后在打印list的长度应该是报错的?因为我在test2()中将list设置成null了,但是实际上为什么能通过编译并且能运行呢?结果是0和1import java.util.*;
public class TestClass
{
  public static void main(String[] args)
  {
    List list = new ArrayList();
    test2(list);
    System.out.println(list.size());
    test3(list);
    System.out.println(list.size());
    //List list1 = null;
    //System.out.println(list1.size());
  }  public static void test2(List list)
  {
    list = null;
  }  public static void test3(List list)
  {
    list.add("aaaa");
  }
}

解决方案 »

  1.   

    你要打印的是list的长度,又不是list的值!那你认为要报什么错?
      

  2.   

    怎么不是报错NullPointerException呢?
      

  3.   

    java里面所有参数都是传值的.
    也就是说 List   list   =   new   ArrayList();                          -------------- No1 public   static   void   test2(List   list) 
        { 
            list   =   null;                                       -------------- No2
        }No2的list只是No1的list的一个copy,它们指向的对象是一样的,但是通过list=null赋值只是改变了No2的list,
    No1的list没有变,但是通过list.add("aaaa"); 是改变了No1的list和No2的list指向的对象的内容.如果对Java理解不深的话,尽量避免这种编程方式.
      

  4.   

    JAVA中对象作为参数,其实传递的是对象引用的一个拷贝,在test2方法中,只是将拷贝重新指向了一个地方,但是原来的那个对象指向的内存并没有被改变,所以不报空指针异常。
      

  5.   


    你只是打印List的长度,肯定不会报NullPointerException,如果是获取其中的值,例如list.get(0)就会报这个错误了
      

  6.   

    java里面所有参数都是传值的.意思能理解,可是不能这么说阿。
    java里面所有方法,如果是对象的话,穿过去的是对象的引用地址, test2(list); 
    你把 main 里面list指向的对象地址传过去了    public   static   void   test2(List   list) 
        { 
      // 这里的 list 是一个本地变量,此list非main里面的list,不过他们指向了同一个对象
            list   =   null; 
    // 你把本地变量指向了null, 并不会影响main里面的 list 哦
        } 而    public   static   void   test3(List   list) 
        { 
            list.add("aaaa"); 
      // 此操作直接对list指向的对象进行了操作,因为main里面的list指向同一个对象,所以在那面能访问到
        } 总结:java传递对象类似于C里面的内存指针哦。2个变量指向了同一个地址。test是修改变量自己的指针,test3是修改被指向地址的那块内存的内容