0

所以我有一个对象数组,我试图访问嵌套类中的变量。我得到一个空指针异常。新手在这里,所以我处理这个问题的方式可能是错误的。

foo Foo = new foo();
Foo.initcfoo(1);
Foo.cfoo[0].a = 1;


public class foo {
   childfoo[] cfoo;

   public void initcfoo(size){
      cfoo = new childfoo [size];
   }
   public class childfoo{
      public int a,b,c;
   }
}
4

3 回答 3

2

您已初始化数组但未初始化其成员。改成

   public void initcfoo(size){
       cfoo = new childfoo [size];
       for (int i = 0; i < cfoo.length; i++) {
           cfoo[i] = new childfoo();
       }
   }

考虑使用 Java 命名约定。类名以大写字母开头。用于camelCase变量和方法名称。


当你不这样做时,声明

Foo.cfoo[0].a = 1;

正在尝试访问索引 0 处的元素,但该元素尚未初始化,因此是null. 尝试取消引用null以访问该字段a会引发NullPointerException.

于 2013-09-06T21:36:03.043 回答
0

这一行cfoo = new childfoo [size];只是初始化数组(意味着数组的大小size将包含 object 的任何实例childfoo),但数组仍然是空的,并且其中没有任何内容。

childfoo但是在使用您正在访问它的实例填充数组之前,Foo.cfoo[0].a这会导致Null Pointer Exception手段Foo.cfoo[0]is null

解决方案是首先用对象填充数组,childfoo然后访问它。

例如

cfoo[0] = new childfoo()然后 cfoo[0].a

您可以了解有关java 数组的更多信息

于 2013-09-06T21:42:02.370 回答
0

请尊重java中的命名约定,并且尽量不要直接访问类的变量(除了从类本身或其内部类之一)

使用 setter 和 getter,例如:

public class Foo {

    // private variables
    private ChildFoo[] cFoo;

    // setter
    public void setCFoo(Foo.ChildFoo[] cFoo) {
        this.cFoo = cFoo;
    }

    // getter
    public Foo.ChildFoo[] getCFoo() {
        return cFoo;
    }

    public void initCFoo(int size) {
        cFoo = new ChildFoo[size];
        for (int i = 0; i < cFoo.length; i++) {
            cFoo[i] = new ChildFoo();
        }
    }


    public class ChildFoo {

        // private variables
        private int a, b, c;

        // setter
        public void setA(int a) {
            this.a = a;
        }

        // getter
        public int getA() {
            return a;
        }

        public void setB(int b) {
            this.b = b;
        }

        public int getB() {
            return b;
        }

        public void setC(int c) {
            this.c = c;
        }

        public int getC() {
            return c;
        }
    }
}


    Foo foo = new Foo();
    foo.initcFoo(1);
    foo.getCFoo()[0].setA(1);
于 2013-09-06T21:57:58.277 回答