容器ArrayList作为类的属性,就可以不用new,之后直接add()。但是在一个方法里定义了一个ArrayList的对象就必须要先new才能再add()。。why?????

解决方案 »

  1.   

    成员变量在类实例化的时候有默认值,局部变量没有。
    不过。。ArrayList的默认值是一个空的ArrayList?以前倒没注意过。一般来说,对象的默认值都是Null
      

  2.   

    ---下面颜色字体部分、纯属个人猜测---
    ArrayList作为类的属性时、不用new直接可以添加是因为编译器认为你会在其它模块给它设值开辟空间、所以便可以编译通过、而在局部方法里面、编译器很肯定的知道你绝对没有给它开辟空间、那么就不会让你编译通过、当然现在都是使用工具、工具也会有相应的提示的!
    ---------猜测结束---------
    就算ArrayList作为属性时、你没有创建对象、直接add、那也会有运行时错误的。
    使用没有初始化的变量都会抛出:NullPointerException
    ---------------------------------
    java中声明一个变量之后、必须用赋值语句对变量进行显式初始化。
      

  3.   

    ArrayList不管做为什么,都要先new,才能add,你很可能没看到它new的地方,或者是别人new的,(引用)传递给了它
      

  4.   


    什么是new?new 就是在堆中创建一个对象add是这个对象的方法。比如你是个人(ARRAYLIST),你妈妈(JVM)一定要把你生(NEW)下来
    你才有吃饭(ADD)这个方法 是吗?能理解这个那就OK了。
      

  5.   

    肯定是要new的 是不是其他地方new了你没有注意
      

  6.   

    那是不可能没有new 的,你自己没有写new 不代表程序或者框架没new, 空指针怎么可能调用方法?
      

  7.   

    +1
    成员变量,如果是对象的话,默认值都是null,ArrayList类型的也是null,不会是空的ArrayList。
    --------------------楼主说的那种情况比较诡异,估计有以下两种可能:
    1、 如果楼主的意思是运行错误,那就和大家说的一样:可能在别的地方赋值了,所以不报错。
    2、 如果楼主的意思是编译错误,如代码所示,list_2会报未初始化的编译错误,而list_1不会。
    (这是由于属性会自动初始化为null,所以编译不会报错)    private ArrayList list_1 ;
        public void test() {
            ArrayList listl_2;
            list_2.add("ui");  // 编译报错
            list_1.add("ui");  // 不报错
        }
      

  8.   

    懂了,你给的代码就是我描述的意思,原来引用属性默认为null。晓得了