次のコードをコンパイル、実行するとどうなりますか。
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が代入