try-with-resources難易度 標準無料
次のコードの出力として正しいものを選べ。
1 public class Q9 {
2 static class Res implements AutoCloseable {
3 String name;
4 Res(String name) { this.name = name; System.out.println("open " + name); }
5 public void close() { System.out.println("close " + name); }
6 }
7 public static void main(String[] args) {
8 try (Res a = new Res("A"); Res b = new Res("B")) {
9 System.out.println("body");
10 }
11 }
12 }
- Aopen A / open B / body / close A / close B
- Bopen A / open B / body / close B / close A
- Copen B / open A / body / close A / close B
- Dopen A / open B / close B / close A / body
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:B✓Gold監修
解説
try-with-resources のリソースは宣言順に初期化され(open A → open B)、
各誤答が違う理由try ブロック本体が実行された後(body)、宣言と逆順に close() される(close B → close A)。
JLS §14.20.3 で「リソースは宣言と逆順にクローズされる」と規定されている(後で開いたものを先に閉じる=スタック的解放)。- Aclose が宣言順(A→B)になっている誤り。実際は逆順(B→A)。
- C初期化(open)も逆順だとした誤り。openは宣言順(A→B)。
- Dbody より先に close するとした誤り。close は try 本体の完了後。
ひっかけ: open は宣言順・close は逆順。「初期化と解放で順序が逆になる」点。
実機確認の答え合わせ
出力: open A open B body close B close A
✓Gold 保有者による書き下ろし解説・実機で検証済