問題
次のコードをコンパイル、実行するとどうなりますか。
public class Main {
public static void main(String... args) {
SubItem item = new SubItem();
item.setName(args);
System.out.println(item);
}
}
class Item {
private String name;
public String getName() {
retrun name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return getName();
}
}
class SubItem extends Item {
public void setName(String name) {
super.setName("¥" + name + "¥");
}
public void setName(String[] nameParts) {
var output = format(nameParts);
setName(output);
}
private String format(String[] parts) {
var sb = new StringBuilder();
for (String part : parts) {
sb.append(part).append(' ');
}
return sb.toString();
}
}
なお、コードの実行には以下のコマンドを使用するものとする。
$ java Main Duke Scott Sakila
選択肢
A)¥Duke Scott Sakila ¥ が出力される
B)Duke Scott Sakila ‘ が出力される
C)NullPointerException がスローされる
D)” ” が出力される
E)何も出力されない
F)ArrayIndexOutOfBoundsException がスローされる
G)”Duke Scott Sakila ” が出力される
H)コンパイルエラーになる
解答
A)¥Duke Scott Sakila ¥ が出力される
B)Duke Scott Sakila ‘ が出力される
C)NullPointerException がスローされる
D)” ” が出力される
E)何も出力されない
F)ArrayIndexOutOfBoundsException がスローされる
G)”Duke Scott Sakila ” が出力される
H)コンパイルエラーになる
解説
実行の流れ
- メインメソッドの実行:
SubItem item = new SubItem();
でSubItem
のインスタンスを作成。item.setName(args);
でargs
(コマンドライン引数、ここでは["Duke", "Scott", "Sakila"]
)を渡します。
- メソッド呼び出し:
SubItem
のsetName(String[] nameParts)
メソッドが呼び出され、配列を受け取ります。format(nameParts)
メソッドが呼ばれ、配列の要素を結合して文字列を生成します。
setName(String name)
メソッド:- 最後に、
super.setName("¥" + name + "¥")
が呼ばれ、Item
クラスのsetName
メソッドが実行されます。
- 最後に、
- toString メソッド:
System.out.println(item);
でtoString()
メソッドが呼ばれ、最終的にgetName()
を返します。
コンパイルエラーの原因
Item
クラスのgetName()
メソッドでretrun
という誤字があるため、コンパイルエラーが発生します。この部分は正しくはreturn
でなければなりません。
結論
修正を加えない限り、コンパイルエラーが発生するため、選択肢 H)コンパイルエラーになる が正しいです。
対象資格:Java SE17 認定資格