簡體   English   中英

如何使用數組對象訪問嵌套類中的變量?

[英]How to access the variables in a nested class with array object?

所以我有一個對象數組,我試圖訪問嵌套類中的變量。 我得到一個空指針異常。 新手在這里,所以我接近這個問題的方式可能是錯的。

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

您已初始化陣列,但未初始化其成員。 改成

   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

這行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數組的信息

請尊重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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM