1

誰かがここで何が起こっているのか、どの順序で起こっているのか説明してもらえますか?. 出力は私には意味がありません。

出力は T 1 IOE F です。

コードは次のとおりです。

import java.io.Closeable;
import java.io.IOException;

public class TestRes {
    public static void main(String[] args) {
    try (
            MyResource11 r1 = new MyResource11();
            MyResource21 r2 = new MyResource21();
            ) 
        {
            System.out.print("T ");
        } catch (IOException ioe) {
            System.out.print("IOE ");
        } finally {
            System.out.print("F ");
        }
    }
}

class MyResource11 implements AutoCloseable {
    public void close() throws IOException {
        System.out.print("1 ");
    }
}

class MyResource21 implements Closeable {
    public void close() throws IOException {
        throw new IOException();
    }
}
4

2 に答える 2

4

try-with-resources は、リソースが宣言された順序とは逆の順序でリソースを閉じます。したがって、そのコードは次のようになります。

  1. 版画T
  2. try-with-resources ステートメントが閉じようとしていますr2
  3. それは例外をスローします
  4. try-with-resources ステートメントが正常に終了r1し、出力されます1
  5. 例外ブロックが実行され (からの例外に対してr2)、出力されます。IOE
  6. finally ブロックが実行され、出力されますF

JLS の try-with-resources 部分を読む価値があります。この部分には、未解明の try-with-resources ステートメントのコード例が含まれています (たとえば、try/ catch/だけの同等のコードfinally)。そのセクションから:

リソースは、初期化された順序とは逆の順序で閉じられます。リソースは、null 以外の値に初期化された場合にのみ閉じられます。1 つのリソースのクローズの例外によって、他のリソースのクローズが妨げられることはありません。このような例外は、初期化子、try ブロック、またはリソースのクローズによって以前に例外がスローされた場合、抑制されます。

于 2019-04-17T09:32:35.793 に答える
2

あなたのコードはのショートカットです

public static void main(String[] args) {
    try {
        MyResource11 r1 = new MyResource11();
        try {
            MyResource21 r2 = new MyResource21();
            try {
                System.out.print("T ");
            } finally {
                r2.close();
            }
        } finally {
            r1.close();
        }
    } catch (IOException ioe) {
        System.out.print("IOE ");
    } finally {
        System.out.print("F ");
    }
}
于 2019-04-17T09:34:27.257 に答える