所以我有一个对象数组,我试图访问嵌套类中的变量。我得到一个空指针异常。新手在这里,所以我接近这个问题的方式可能是错误的。
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;
}
}
答案 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);