問題
次のコードをコンパイル、実行するとどうなりますか。
public class Main {
public static void main(String... args) {
System.out.println(Converter.execute("Duke"));
}
}
class Converter {
public static String execute(Object obj) {
String s = "";
if (!(obj instanceof String str))
s = obj.toString();
else
s = str.toLowerCase();
return s;
}
}
選択肢
A)コンパイルエラーになる
B)Duke が出力される
C)NullPointerException がスローされる
D)ClassCastException がスローされる
E)duke が出力される
F)java.lang.String が出力される
解答
A)コンパイルエラーになる
B)Duke が出力される
C)NullPointerException がスローされる
D)ClassCastException がスローされる
E)duke が出力される
F)java.lang.String が出力される
解説
コードの解析
Main
クラス:main
メソッドからConverter.execute("Duke")
を呼び出します。
Converter
クラス:execute
メソッドは、引数obj
がString
型かどうかをチェックしています。instanceof
演算子とパターンマッチングを使用しています。obj
がString
型の場合、str
という変数にキャストし、str.toLowerCase()
を呼び出します。- それ以外の場合、
obj.toString()
を呼び出します。
main メソッドの実行
- 引数
"Duke"
はString
型ですので、obj instanceof String str
の条件が真になります。 - したがって、
s = str.toLowerCase();
が実行され、s
には"duke"
が代入されます。
結果
return s;
で"duke"
が返され、System.out.println(Converter.execute("Duke"));
によりduke
が出力されます。
選択肢の検討
A)コンパイルエラーになる
→ 不正解。このコードは正しくコンパイルされます。
B)Duke が出力される
→ 不正解。小文字の duke
が出力されます。
C)NullPointerException がスローされる
→ 不正解。obj
は String
型のリテラルであり、null ではありません。
D)ClassCastException がスローされる
→ 不正解。型チェックを行っているため、キャストエラーは発生しません。
E)duke が出力される
→ 正解。小文字で出力されます。
F)java.lang.String が出力される
→ 不正解。出力は String
そのものではなく、duke
です。
対象資格:Java SE17 認定資格