web-dev-qa-db-ja.com

New / strange Java "try()"構文?

Eclipseのカスタムフォーマットオプションをいじりながら、サンプルコードの1つで、次のようなコードを見ました。

/**
 * 'try-with-resources'
 */
class Example {
    void foo() {
        try (FileReader reader1 = new FileReader("file1"); FileReader reader2 = new FileReader("file2")) {

        }
    }
}

tryがこのように使用されるのを見たことがなく、Javaで9年間コーディングしました!これを行う理由を誰もが知っていますか? -ケース/これを行うことの利点は?

私が見たコードの他の部分、私は非常に便利な速記だと思ったので、ここでもそれを共有しています、それが何をするかはかなり明白です:

/**
 * 'multi-catch'
 */
class Example {
    void foo() {
        try {
        } catch (IllegalArgumentException | NullPointerException | ClassCastException e) {
            e.printStackTrace();
        }
    }
}
51
Ali

Java 7.で追加されました。 try-with-resources ステートメントと呼ばれます。

/編集

これもここに投げ込むかもしれません。次のようなラッパークラスを使用する場合、try-with-resourcesステートメントを使用してLocksを管理できます。

public class CloseableLock implements Closeable {
    private final Lock lock;

    private CloseableLock(Lock l) {
        lock = l;
    }

    public void close() {
        lock.unlock();
    }

    public static CloseableLock lock(Lock l) {
        l.lock();
        return new CloseableLock(l);
    }
}

try(CloseableLock l = CloseableLock.lock(lock)) { // acquire the lock
    // do something
} // release the lock

ただし、すべてのリソースに対して変数を宣言する必要があるため、この利点は議論の余地があります。

63
Jeffrey

これはJava 7の新しいtry-with-resourcesステートメント: http://download.Oracle.com/javase/7/docs/technotes/guides/language/try-with -resources.html

10

これらはJDK7で導入された変更です。

最初のステートメントは、try-with-resourcesです。それらがなぜ存在するのか正確にはわかりませんが、例外はしばしば入力ストリームなどによって引き起こされます。読みやすさを改善するだけだと思います。編集:他の回答者のおかげで、私はjavadocを読んで、AutoCloseableを実装するすべてのI/Oストリームを閉じ、多くの状況でfinallyブロックの必要性を省略します

2つ目はマルチキャッチです。これは、まったく同じ方法で処理する異なる例外がある場合に非常に便利です。

6
MarioDS

Try-with-resourceと呼ばれます。言語があなたのためにそれをするので、それはあなた自身の後をきれいにする必要がないようにする方法です。

2
kasavbere

_C Sharp_のusing(Resource)と同じ使用法。これは、プログラムがこのコードブロックから除外されたときに、このリソースが自動的にリサイクルされることを意味します。

Try-with-resourcesステートメントは、ステートメントの最後で各リソースが閉じられるようにします。 Java.io.Closeableを実装するすべてのオブジェクトを含むJava.lang.AutoCloseableを実装するオブジェクトは、リソースとして使用できます。

try-with-resourcesステートメント

1
Chopping

Java 7.で追加されました。リソースで試用と呼ばれます。リソースで試用ステートメント機能が導入されました。Java 7バージョン。リソースで試用ステートメントは1つまたは複数のステートメントを宣言するtryステートメントリソースは、プログラムの終了後に閉じる必要があるオブジェクトです。

Java 7の前に、finallyブロックを使用して、プログラムで使用したリソースを閉じます。finallyブロックでは、プログラムで使用したすべてのリソースを手動で閉じる必要があります。 リソースで試してみてください

1
Aakash Garg

これは、リソースを使用して呼び出されます。リソースを使用したtryでは、tryセクションが終了すると、resourcesセクションで宣言されたすべての種類のクローズ可能なストリームが閉じられます。だからそれはほとんどです

try{
InputStream is;
//Stuff
}finally{
is.close()
}
0
Shawn Shroyer

Try-with-resourcesステートメントは、1つ以上のリソースを宣言するtryステートメントです。リソースは、プログラムの終了後に閉じる必要があるオブジェクトです。 try-with-resourcesステートメントは、ステートメントの最後で各リソースが閉じられるようにします。 Java.io.Closeableを実装するすべてのオブジェクトを含むJava.lang.AutoCloseableを実装するオブジェクトは、リソースとして使用できます。

0
Nada Touil