🐡
【Java】初期化とは
概要
初期化とは、変数やオブジェクトに対して、使用する前に適切な値や状態を割り当てるプロセスを指す。そうすることで、値や状態が割り当てられていないのに、変数やオブジェクトを参照する、といったミスを防げる。
初期化の仕方
基本編
基本的なデータ型として、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