
問題
次のコードをコンパイル、実行するとどうなりますか。
public class Main {
public static void main(String... args) {
Lesson obj = new Lesson();
obj.print();
}
}
class Lesson {
Student[] students;
{students = new Student[2];}
public Lesson() {
students[0] = new Student("Duke");
students[1] = new Student("Scott");
}
public void lesson() {
students[0] = new Student("Duke");
students[1] = new Student("Scott");
students[2] = new Student("Sakila");
}
public void print() {
for (Student s : students) {
System.out.print(s + " ");
}
}
}
record Student(String name) {}
選択肢
A)null null が出力される
B)Student[name=Duke] Student[name=Scott] Student[name=Sakila] Student[name=Duke] Student[name=Scott] が出力される
C)Student[name=Duke] Student[name=Scott] Student[name=Duke] Student[name=Scott] Student[name=Sakila] が出力される
D)Student[name=Duke] Student[name=Scott] が出力される
E)NullPointerException がスローされる
F)null null null が出力される
G)Student[name=Duke] Student[name=Scott] Student[name=Sakila] が出力される
解答
A)null null が出力される
B)Student[name=Duke] Student[name=Scott] Student[name=Sakila] Student[name=Duke] Student[name=Scott] が出力される
C)Student[name=Duke] Student[name=Scott] Student[name=Duke] Student[name=Scott] Student[name=Sakila] が出力される
D)Student[name=Duke] Student[name=Scott] が出力される
E)NullPointerException がスローされる
F)null null null が出力される
G)Student[name=Duke] Student[name=Scott] Student[name=Sakila] が出力される
解説
Lessonクラスのコンストラクタで、students配列はサイズ2の配列として初期化され、students[0]とstudents[1]にStudent("Duke")とStudent("Scott")がそれぞれ代入されます。print()メソッドはstudents配列の要素を順番にループして出力します。students配列には 2つの要素(Student("Duke")とStudent("Scott"))しか含まれていません。lesson()メソッドでstudents[2]に新しいStudent("Sakila")を代入しようとしています。しかし、students配列は サイズ2の配列しか用意されていないため、students[2]にアクセスしようとすると、配列の範囲外にアクセスしていることになり、ArrayIndexOutOfBoundsExceptionが発生します。
ただし、このコードでは lesson() メソッドが実行されていないため、実行時に ArrayIndexOutOfBoundsException は発生しません。しかし、students 配列の全ての要素に Student オブジェクトが格納されていない場合、例えば null が入っている場合に、print() メソッドで null な要素の toString() メソッドを呼び出すと、NullPointerException が発生します。
public class Main {
public static void main(String... args) {
Lesson obj = new Lesson(); //1. インスタンス化 引数なし
obj.print(); //4. Lessonクラスのprint()メソッドを呼び出し
}
}
class Lesson {
Student[] students;
{students = new Student[2];}
public Lesson() { //2.引数なしのコンストラクタ
students[0] = new Student("Duke"); //2-1. 配列0番目にレコードクラスを生成しDukeを代入
students[1] = new Student("Scott"); //2-2. 配列1番目にレコードクラスを生成しScottを代入
}
public void lesson() {
students[0] = new Student("Duke");
students[1] = new Student("Scott");
students[2] = new Student("Sakila");
}
public void print() { //5. print()メソッド
for (Student s : students) { //5-1.拡張for文でレコードクラスを取り出し
System.out.print(s + " "); //5-2.Student[name=Duke] Student[name=Scott] を出力
}
}
}
record Student(String name) {} //レコードクラス. コンポーネント:name
//3. DukeとScottが代入
対象資格:Java SE17 認定資格
