13章42

TANIAOKA, Akihiro - May 22 - - Dev Community

このJavaのプログラムを分解して、なぜ答えがCなのかを説明します。

まず、プログラムを見てみましょう。

クラス Sample

public class Sample implements AutoCloseable {
    @Override
    public void close() throws Exception {
        System.out.println("C");
    }
}
Enter fullscreen mode Exit fullscreen mode

このクラスはAutoCloseableインターフェースを実装しており、closeメソッドがオーバーライドされています。このcloseメソッドは、クラスが閉じられるときに呼び出され、「C」を出力します。

クラス Main

public class Main {
    public static void main(String[] args) {
        try (Sample s = new Sample()) {
            throw new Exception();
        } catch (Exception e) {
            System.out.println("A");
        } finally {
            System.out.println("B");
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

ここでは、try-with-resources文を使用しています。この文では、tryブロックが終了すると自動的にリソースが閉じられます。

プログラムの実行順序

  1. tryブロックに入る。
  2. Sampleクラスのインスタンスを作成し、sに代入する。
  3. tryブロック内でExceptionがスローされる。
  4. Exceptionがスローされると、まずリソース(ここではs)が閉じられる。このとき、closeメソッドが呼び出され、「C」が出力される。
  5. その後、catchブロックが実行され、「A」が出力される。
  6. 最後に、finallyブロックが実行され、「B」が出力される。

まとめ

  • 最初にtryブロック内で例外がスローされると、リソースが閉じられる(closeメソッドが呼び出される)ため、「C」が出力されます。
  • その後、catchブロックで「A」が出力されます。
  • 最後にfinallyブロックで「B」が出力されます。

したがって、出力は順に「C」「A」「B」となります。よって、答えはCになります。

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .