SE17_A-22

Java

次のコードをコンパイル、実行するとどうなりますか。

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が代入

前の問題へ SE17_A-21

次の問題へ SE17_A-23