1概要

Java 7で導入されたtry-with-resourcesのサポートにより、

try

ブロック内で使用されるリソースを宣言することができ、そのブロックの実行後にリソースが閉じることが保証されます。宣言されたリソースは

AutoCloseable

インターフェースを実装する必要があります。


2

try-with-resources


を使う

簡単に言うと、自動クローズするには、以下に示すように、リソースを

try

内で宣言し初期化する必要があります。

try (PrintWriter writer = new PrintWriter(new File("test.txt"))) {
    writer.println("Hello World");
}


3

try



catch-finally



try-with-resources


に置き換える

新しい

try-with-resources

機能を使用するための単純で明白な方法は、伝統的で冗長な

try-catch-finally

ブロックを置き換えることです。

次のコードサンプルを比較してみましょう。最初は典型的な

try-catch-finally

ブロック、次に新しいアプローチで、同等のtry-with-resourcesブロックを使用します。

Scanner scanner = null;
try {
    scanner = new Scanner(new File("test.txt"));
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    if (scanner != null) {
        scanner.close();
    }
}

そして、これがtry-with-resourcesを使った超簡潔な解決策です。

try (Scanner scanner = new Scanner(new File("test.txt"))) {
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException fnfe) {
    fnfe.printStackTrace();
}

** 4複数のリソースを持つ

try-with-resources

セミコロンで区切ることで、複数のリソースを

try-with-resources

ブロックで正しく宣言できます。

try (Scanner scanner = new Scanner(new File("testRead.txt"));
    PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {
    while (scanner.hasNext()) {
    writer.print(scanner.nextLine());
    }
}


5

__

AutoCloseable

+を持つカスタムリソース

__


try-with-resources

ブロックによって正しく処理されるカスタムリソースを構築するには、クラスは

Closeable

または

AutoCloseable

インターフェースを実装し、

close

メソッドをオーバーライドする必要があります。

public class MyResource implements AutoCloseable {
    @Override
    public void close() throws Exception {
        System.out.println("Closed MyResource");
    }
}


6. リソース終了順

最初に定義/取得されたリソースは最後に閉じられます。この動作の例を見てみましょう。

リソース1:

public class AutoCloseableResourcesFirst implements AutoCloseable {

    public AutoCloseableResourcesFirst() {
        System.out.println("Constructor -> AutoCloseableResources__First");
    }

    public void doSomething() {
        System.out.println("Something -> AutoCloseableResources__First");
    }

    @Override
    public void close() throws Exception {
        System.out.println("Closed AutoCloseableResources__First");
    }
}

リソース2:

public class AutoCloseableResourcesSecond implements AutoCloseable {

    public AutoCloseableResourcesSecond() {
        System.out.println("Constructor -> AutoCloseableResources__Second");
    }

    public void doSomething() {
        System.out.println("Something -> AutoCloseableResources__Second");
    }

    @Override
    public void close() throws Exception {
        System.out.println("Closed AutoCloseableResources__Second");
    }
}

コード:

private void orderOfClosingResources() throws Exception {
    try (AutoCloseableResourcesFirst af = new AutoCloseableResourcesFirst();
        AutoCloseableResourcesSecond as = new AutoCloseableResourcesSecond()) {

        af.doSomething();
        as.doSomething();
    }
}

出力:


Constructor – > AutoCloseableResources

First

+

Constructor – > AutoCloseableResources

Second

+

Something – > AutoCloseableResources

First

+

Something – > AutoCloseableResources

Second

+

Closed AutoCloseableResources

Second

+

Closed AutoCloseable__Resources

** 7.

キャッチ&

最終__


try-with-resources

ブロック



catch

ブロックと

finally

ブロック

を持つことができます – これは伝統的な

try

ブロックと同じように動作します。


8結論

この記事では、try-with-resourcesの使い方、

try



catch

、および

finally

をtry-with-resourcesで置き換える方法、カスタムリソースを

AutoCloseable

で構築する方法、そしてリソースを閉じる順序について説明しました。

例の完全な

ソースコード

はhttps://github.com/eugenp/tutorials/tree/master/core-java[このGitHubプロジェクト]にあります。