SE17_B-08

Java

次のコードをコンパイル、実行するとどうなりますか。
なお、[ 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を出力
	}
}

前の問題へ SE17_B-07

次の問題へ SE17_B-09