
問題
次のコードをコンパイル、実行するとどうなりますか。
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」は出力されません。
対象資格:Java SE17 認定資格