次のコードをコンパイル、実行するとどうなりますか。
なお、[ A ]の箇所で例外はスローされないものとします。
public class Main {
public static void main(String... args) {
try (MyResource a = new MyResource("a"); MyResource b = new MyResource("b")) {
//[ A ]
} catch (RuntimeException e) {
System.out.print(" catch:" + e);
} catch (Exception e) {
System.out.print(" catch:" + e);
} finally {
System.out.print(" finally");
}
}
}
class MyResource implements AutoCloseable {
private String label;
public MyResource(String label) {
this.label = label;
}
public void close() {
System.out.print(" closed:" + label);
}
}
選択肢
A)closed:a closed:b finally が出力される
B)finally closed:b closed:a が出力される
C)finally が出力される
D)closed:b closed:a finally が出力される
E)closed:b closed:a が出力される
F)finally closed:a closed:b が出力される
解答
A)closed:a closed:b finally が出力される
B)finally closed:b closed:a が出力される
C)finally が出力される
D)closed:b closed:a finally が出力される
E)closed:b closed:a が出力される
F)finally closed:a closed:b が出力される
解説
public class Main {
public static void main(String... args) {
//複数のリソース記述は逆順から実行される
try (MyResource a = new MyResource("a"); //2-1.
MyResource b = new MyResource("b")) { //1-1.
//[ A ]
} catch (RuntimeException e) {
System.out.print(" catch:" + e);
} catch (Exception e) {
System.out.print(" catch:" + e);
} finally {
System.out.print(" finally"); //3.finallyを出力
}
}
}
class MyResource implements AutoCloseable {
private String label; //1-4. bが代入 2-4.aが代入
public MyResource(String label) { //1-2. 2-2.
this.label = label; //1-3. 2-3.
}
public void close() { //1-5. 2-5. close( )は必ず呼ばれる
System.out.print(" closed:" + label); //1-6. closed:bを出力
//2-6. closed:aを出力
}
}