🐡

【Java】初期化とは

2024/01/29に公開

概要

初期化とは、変数やオブジェクトに対して、使用する前に適切な値や状態を割り当てるプロセスを指す。そうすることで、値や状態が割り当てられていないのに、変数やオブジェクトを参照する、といったミスを防げる。

初期化の仕方

基本編

基本的なデータ型として、int / float / double / booleanといった形がある。これらは、直接値を割り当てることで、初期化される。

int number = 10; // int型の変数numberを10で初期化
double rate = 3.14; // double型の変数rateを3.14で初期化
boolean isAvailable = true; // boolean型の変数isAvailableをtrueで初期化

オブジェクト型

newというキーワードを使用しインスタンスを作成することで初期化される。

String greeting = new String("Hello, World!"); // Stringオブジェクトの初期化
MyClass myObject = new MyClass(); // MyClassのインスタンスを初期化

自分のミス

起こったこと

以下、記述をしていた。

private List<Customer> customerList;

public List<Customer> createCustomerList() {
    if (customerList == null || customerList.isEmpty()) {
        customerList = new LinkedList<>();
    }
    return customerList;
}

(中略)

public void addCustomer(String firstName, String lastName, String email) {
    Customer newCustomer = new Customer(firstName, lastName, email);
    customerList.add(newCustomer);
    System.out.println("customerList2: " + customerList);
}

以下行では、Customerオブジェクトのリストを保持するためのList型の変数、customerListを宣言しているが、初期化はしていない。つまり、customerListがまだ何も参照していないnullの値を持っていることを意味している。

private List<Customer> customerList;

この状態のままcustomerListを参照すると、NullPointerExceptionというエラーが発生する。addCustomerでcustomerListが使われる前に、 createCustomerListで初期化されるように、コードを修正する必要がある。

解決策

以下行でnew ArrayList<>(); を使用しArrayListのインスタンスを初期化している。createCustomerList();を追加することで、インスタンス初期化後に、customerList.addが使われるように設定できる。これにより、customerListは空のcustomerListを参照することになるので、nullではなくなり、エラーは発生しない。

public void addCustomer(String firstName, String lastName, String email) {
    createCustomerList(); // ここで customerList の初期化を確認および実行
    Customer newCustomer = new Customer(firstName, lastName, email);
    customerList.add(newCustomer);
    System.out.println("customerList2: " + customerList);
}

Discussion