如何使用数组对象访问嵌套类中的变量?

时间:2013-09-06 21:34:12

标签: java class nested

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这一行cfoo = new childfoo [size];只是初始化数组(意味着数组的大小为size,它将保存对象childfoo的任何实例),但数组仍然是空的并且它'没有任何内容。

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

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

例如

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

您可以详细了解java array

答案 2 :(得分:0)

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

使用setter和getters,例如:

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