class Student
{
public void display(){
       ArrayList list=null;
       Student student=new Student();
       student.test(list);
       list.add("aa");
}
public void test(ArrayList list)
{
list =new ArrayList();

}
}
报错.如果把list =new ArrayList();移回display()方法内去实例化即不会出错,谁可以在原理上解释一下.
ArrayList不是引用类型吗?为什么不可以在别的方法里new()呢.

解决方案 »

  1.   

    import java.util.ArrayList;class Student {
    public void display() {
    ArrayList<String> list = null;
    Student student = new Student();
    student.test(list);
    list.add("aa");
    } public void test(ArrayList<String> list) {
    list = new ArrayList<String>();
    }
    }你报的是 warnning 吧..我加上泛型以后..这程序没有错.
      

  2.   

    student.test(list);
    public void test(ArrayList list)
    注意这两个list不是一个东西,方法里的list是方法外的list的复制版本。
    对方法里的list的=操作不影响方法外的。
      

  3.   

    嗯..我知道. 他是想让传回来的东西 加上 还可以add..这是不行的.  会报java.lang.NullPointerException
      

  4.   

    是的,我以为是引用类型就可以在方法里new();
      

  5.   

    ArrayList是引用类型还是值类型?
      

  6.   

    你传的不是引用而是null
    test(null)
    多个地址指向同一对象
    进入test方法后
    又有了新地址指向list对象
    也就是说执行test时
    有两个地址引用list对象
    在test中
    public void test(ArrayList list) {
    list =null;
    }
    只是把第2个地址指向了null而已
    考虑问题的时候画个图
    地址  方法或类  对象
    a1      X类    A进行连线
      

  7.   

    应该在方法外声明List就可以了吧,学习
      

  8.   


    class Student 

    public void display(){ 
          ArrayList list=null; //在display中声明的list对象,只在这个方法中有效
          Student student=new Student(); 
          student.test(list); 
          list.add("aa"); 

    public void test(ArrayList list) //这里的的list相当于是局部变量,只在test方法中可见。

    list =new ArrayList(); 这里的list对象就是参数声明的list,跟display中的list是不同的对象} 

      

  9.   

    有两个地址引用list对象 
    在解释下以免误导别人
    我的意思是
    在外面ArrayList list=new ArrayList(); public void test(ArrayList list) 
    {
    进入方法后,就有两个地址执行对象了。
    }
      

  10.   

    我明白了,test方法里的list虽然得到了外面list的引用并在方法里new了下,但test方法并没有返回这个list,所以里面的list的改变不会影响到外面的list。
      

  11.   

    class Student 

    public void display(){ 
          ArrayList list=null; //在display中声明的list对象,只在这个方法中有效 
          Student student=new Student(); 
          student.test(list); 
          list.add("aa"); //在这个方法里,list没有new实例化,只是声明了个变量儿也[=null]的add方法,当然要报错的啊。

    public void test(ArrayList list) //这里的的list相当于是局部变量,只在test方法中可见。 

    list =new ArrayList(); 这里的list对象就是参数声明的list,跟display中的list是不同的对象 } 
    }
      

  12.   

    如果传进来的list不为null的话会影响外面的list,用地址和对象关系来思考。
      

  13.   


    像这种问题画个内存图就很清楚了
    左边是栈放形参,右边是堆放对象。
    调用test()时,两个引用都指向了空,
    new的时候只是让test()中的引用指向了新的对象。
    而原来的list并没有指向新对象,依然指向空。
      

  14.   

    我是这样理解的:
    1.首先ArrayList list=null;  这样声明了一个ArrayList 但并没有实例化,也是就说list指向了一个null(空的对象,根本没有分配在heap给它内存);2.当调用方法student.test(ArrayList list); 方法中list是一个形参,它将指向传给它的实参(也就是display()中定义的list)所指向的对象,即null。(此时形参list和实参list指向同一个对象null,相当于两个参数的指向都是空的,根本没有在heap分配给它们内存)3.在方法内部,形参list被实例化了。这时形参指向了一个对象实例(也就是在内存heap得到内存);(此时形参被实例化了,而实参并没有被实例化)4.方法调用结束时,形参被删除。此时曾经分配给形参list的那部分内存没有任何引用指向它,内存为垃圾将会被垃圾回收器收回。而实参此时还是指向null,没有得到内存。
      

  15.   

    如果传进来的list不为null的话,同样也不会影响到实参的null,因为这里面的形参引用了里一个对象了。
      

  16.   

    18 楼的意思是说,对test方法中的list操作会影响外面,但不是指test中 引用=new的情况,特此声明,引免误导他人。
      

  17.   

    list没有实例化。list是null,调用list.add("aa")当然报错
      

  18.   


    我推荐这一楼的说法呀,在你别一个方法,对ArrayList 的变量赋值时,但的赋值并不给当前调用方法中的参数,加上其赋值效果,也即,在dispaly中,list.add时,list还是null值,这样就会报空指针的错误,可明白呀!如果想进行调用的话,你可以对test方法,进行反回list 的方法,进行在display调用呀!可明白呀!
      

  19.   

    import java.util.*;
    class Student 

    public void display()

    ArrayList list=null; 
    Student student=new Student(); 
    student.test(list); 
    list.add("aa"); 

    public void test(ArrayList list) 

    list =new ArrayList(); 


    }为什么我调的没有报错?