【Java SE17 Silver 模擬試験】B-22

Java SE17 Silver 模擬試験
Java SE17 Silver 模擬試験

問題

次のコードをコンパイル、実行するとどうなりますか。

public class Main {
	public static void main(String... args) {
		AutoCloseable res = new MyResource("res");
		try {
			throw new Exception();
		} catch (Exception e) {
			System.out.print(" catch");
		} 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);
	}
}

class MyException extends Exception { }

選択肢

A)closed:res catch が出力される

B)コンパイルエラーになる

C)closed:res catch finally が出力される

D)catch finally closed:res が出力される

E)catch closed:res が出力される

F)catch closed:res finally が出力される

G)catch finally が出力される

解答

A)closed:res catch が出力される

B)コンパイルエラーになる

C)closed:res catch finally が出力される

D)catch finally closed:res が出力される

E)catch closed:res が出力される

F)catch closed:res finally が出力される

G)catch finally が出力される

解説

このコードを実行すると、出力結果は G)catch finally が出力される になります。

リソースの初期化:

AutoCloseable res = new MyResource("res");

MyResourceインスタンスが作成され、label"res" が設定されます。この時点では、close() メソッドはまだ呼ばれていません。

例外の発生:

throw new Exception();

ここで例外が発生し、catchブロックに移ります。

例外のキャッチ:

catch (Exception e) {
System.out.print(" catch");
}

例外がキャッチされ、「 catch」と出力されます。

finallyブロックの実行:

finally {
System.out.print(" finally");
}

finallyブロックは必ず実行されるため、「 finally」と出力されます。

リソースのクリーンアップ: しかし、このコードではtry-with-resources文を使っていないため、close() メソッドは呼ばれません。したがって、「 closed」は出力されません。

前の問題へ SE17_B-21

次の問題へ SE17_B-23

対象資格:Java SE17 認定資格