1. 程式人生 > >Java自定義類陣列的建立和初始化

Java自定義類陣列的建立和初始化

  剛剛在慕課學習Java的集合類List過程中,向集合中新增元素時,遇到一個問題:

  • 定義了一個Course類;
public class Course {

    private String id;    
    private String name;  //課程名稱

    //get  set方法
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return
name; } public void setName(String name) { this.name = name; }
  • 在測試類中有一個Course類的List集合allCourses,一個向該List集合新增元素的方法addToAllCourses() ;
public class ListTest {  

    private List allCourses;  //用於存放備選課程的List

    //建構函式,初始化allCourses
    public ListTest() {         
        this.allCourses = new
ArrayList(); } public void addToAllCourses(String id, String name) { //List的add(Object e), 新增一個元素 Course cs = new Course(); //建立一個Course物件,並設定其引數 cs.setId(id); cs.setName(name); allCourses.add(cs); // List的addAll(Collection c)方法 Course[] courses = new
Course[3]; courses[0].setId("2"); courses[0].setName("C語言"); courses[1].setId("3"); courses[1].setName("資料庫"); courses[2].setId("4"); courses[2].setName("計算機網路"); allCourses.addAll(Arrays.asList(courses)); //在該方法中 引數必須為collection型別,因此必須用工具類進行型別轉換 } }
  • 主函式測試
    public static void main(String[] args) {
        ListTest list = new ListTest();
        list.addToAllCourses("1", "資料結構");
        List<Course> li = list.getAllCourses();

        for(int i = 0; i < li.size(); i++) {
            System.out.println((i + 1) + ": " + li.get(i).getId() 
                               + " " + li.get(i).getName());
        }
    }

  乍看是沒有問題的,但是一執行,問題就來了,myeclipse報出了空指標異常。異常丟擲點為addToAllCourses()方法中 Course類陣列courses在賦值時的程式碼。

  既然是空指標異常,也就是說,courses[0], courses[1], courses[2]都是沒有被初始化的。

  一般而言,如下的陣列定義在myeclipse中是不會報錯的:

String[] s = new String[3];
s[0] = "000000";
System.out.println(s[0]);

  但是,我的程式碼中,陣列的型別為自定義的類,而非Java本身提供的類(如String類),因而我懷疑是不是我的陣列定義出了問題. 查閱資料後發現,自定義類的陣列定義後的初始化應該如下:

        Course[] courses = new Course[3];

        courses[0] = new Course();

        courses[0].setName("0000000");

        System.out.println(courses[0].getName());

  也就是說,在聲明瞭自定義類的陣列之後,對每一個數組元素的初始化,都要為其new一個物件出來使得指標指向該物件,Java語言本身是不提供在自定義類陣列宣告時候自動建立新物件的方式的。

  此處順便再補充一下類二維陣列的定義及初始化,

/*Java提供類*/

        //方式一:
        String[][] s = new String[][] { {"a", "b", "c"},
                                        {"d", "e", "f"}  };

        //方式二
        int r = 0;
        String[][] s = new String[2][3];
        for (int i = 0; i < 2; i++) 
            for (int j = 0; j < 3; j++) {
                s[i][j] = String.valueOf(r++);
            }

/*自定義類*/
        Course[][] courses = new Course[2][3];  //宣告
        courses[0][0] = new Course();  //使用時new一個例項
        courses[0][0].setId("0");
        courses[0][0].setName("000000");

        System.out.println(courses[0][0].getId() + "  " 
                           + courses[0][0].getName());
        //測試 不報空指標異常