このJavaコードのスニペットには、Item
クラスとMain
クラスの2つのクラスが含まれています。Item
クラスにはname
というString
型の変数とprice
というint
型の変数があり、price
は100に初期化されています。
Main
クラスにはmain
メソッドがあり、ここでプログラムが実行されます。main
メソッドはItem
オブジェクトの配列items
を作成し、その長さを3に設定します。その後、整数型の変数total
を0で初期化し、for
ループを使用して各Item
オブジェクトのprice
をtotal
に加算します。
しかし、このコードにはItem
オブジェクトを実際にitems
配列に割り当てるコードがありません。つまり、items
配列にはデフォルトでnull
が設定されているため、Item
のインスタンスが存在せず、items[i].price
を参照しようとするとNullPointerException
が発生します。
そのため、選択肢E「実行時に例外がスローされる」という答えが正しいです。Item
オブジェクトがitems
配列に割り当てられていないため、for
ループの実行時にnull
のprice
にアクセスしようとして例外がスローされます。
コードにコメントを加えて説明すると以下のようになります:
public class Item { String name; // 商品名を保存する変数 int price = 100; // 商品の価格を保存する変数、デフォルトは100
} public class Main { public static void main(String[] args) { Item[] items = new Item[3]; // Itemオブジェクトの配列を長さ3で初期化するが、各要素はnullである int total = 0; // 総価格を保存する変数、初期値は0 for (int i = 0; i < items.length; i++) { // items配列を繰り返し処理する total += items[i].price; // items配列の各Itemの価格をtotalに加算する // ↑ この時点でitems[i]はnullなので、NullPointerExceptionがスローされる } System.out.println(total); // 総価格を出力する // ↑ 例外がスローされた場合、この行は実行されない }
}
コメントアウトはコードに直接加えることはできませんが、上記のコメントで各行が何を意味しているかを説明しています。例外が発生するため、System.out.println(total);
は実際には実行されないことに注意してください。
追記
例外を回避し、コードが正常に実行されるようにするには、Item
クラスのオブジェクトをitems
配列に各要素ごとにインスタンス化して割り当てる必要があります。これは、配列を宣言した後にfor
ループを使用して行うことができます。
以下のように修正します:
public class Item { String name; // 商品名を保存する変数 int price = 100; // 商品の価格を保存する変数、デフォルトは100
} public class Main { public static void main(String[] args) { Item[] items = new Item[3]; // 長さ3のItemオブジェクト配列を初期化 // 配列の各要素にItemのインスタンスを割り当てる for (int i = 0; i < items.length; i++) { items[i] = new Item(); // 新しいItemオブジェクトを作成して配列に割り当てる } int total = 0; // 総価格を保存する変数、初期値は0 for (int i = 0; i < items.length; i++) { // items配列を繰り返し処理する total += items[i].price; // items配列の各Itemの価格をtotalに加算する } System.out.println(total); // 総価格を出力する }
}
この修正により、Item
オブジェクトが配列の各要素に適切に割り当てられ、for
ループが各Item
オブジェクトのprice
をtotal
に加算する際に例外が発生しなくなります。修正後のコードでは、total
には300が出力されるはずです(3つのItem
オブジェクトそれぞれにprice
が100設定されているため)。
Discover more from Coursity
Subscribe to get the latest posts sent to your email.