
問題
次のコードをコンパイル、実行するとどうなりますか。
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 認定資格
